在vue中使用elementUI饿了么框架使用el-tabs,切换Tab如何实现实时加载,以及el-table表格使用总结
当我们在开发中遇到tab切换,这时候用el的el-tabs感觉很方便

但当我在把代码都写完后,发现一个问题就是页面打开时

虽然我们只能看见当前一个tab页,但是vue会帮你把你写的所有tab页的内容都渲染出来了,只是其他的隐藏了,同时其他tab的js也都走了一边,当你点击tab时js就不会再去请求后台

这种机制会造成一个问题,就是如果每个tab页的数据都过大的时候,可能就会导致首次打开页面卡顿现象,同时如果数据库数据在实时发生变化的话,比如你一分钟前打开的这个页面,看的是tab1的内容,看了1分钟后我想看tab2的内容,但此时tab2的内容后台数据库已经发生变化了,你能看到的只是1分钟前的数据,那该怎么解决这个问题呢?

首先一开始一次加载所有tab的代码是这样的

<el-tabs v-model="activeName" type="card" @tab-click="handleClick" style="margin-top:15px">
        <el-tab-pane label="待质检" name="second">
          <second :form='form' ref="childComponent"></second>
        </el-tab-pane>
        <el-tab-pane label="已质检" name="third">
          <third :form='form'></third>
        </el-tab-pane> 
        <el-tab-pane label="待复议" name="fourth">
          <fourth :form='form'></fourth>
        </el-tab-pane>
        <el-tab-pane label="已复议" name="fifth">
          <fifth :form='form'></fifth>
        </el-tab-pane>
      </el-tabs>

这时候v-if的作用就可以发挥出来了,当v-if的值为false时vue是不会去渲染该标签下的内容的

那我们就把tabs下的子模块标签上加v-if,一开始只设置其中一个为true其他都为false,当点击tab切换时去改变v-if的值,代码如下

<el-tabs v-model="activeName" type="card" @tab-click="handleClick" style="margin-top:15px">
        <el-tab-pane label="待质检" name="second">
          <second :form='form' v-if="isSecond" ref="childComponent"></second>
        </el-tab-pane>
        <el-tab-pane label="已质检" name="third">
          <third :form='form' v-if="isThird"></third>
        </el-tab-pane> 
        <el-tab-pane label="待复议" name="fourth">
          <fourth :form='form' v-if="isFourth"></fourth>
        </el-tab-pane>
        <el-tab-pane label="已复议" name="fifth">
          <fifth :form='form' v-if="isFifth"></fifth>
        </el-tab-pane>
      </el-tabs>

js的代码

import Second from './component/WaitQC.vue';
import Third from './component/AlreadyQC.vue';
import Fourth from './component/WaitReconsideration.vue';
import Fifth from './component/AlreadyReconsideration.vue'
export default {
 components: {
        // "first":First,
        "second":Second,
        "third":Third,
        "fourth":Fourth,
        "fifth":Fifth
      },

data() {
    return {
      activeName: "second",
      isSecond:true,
      isThird:false,
      isFourth:false,
      isFifth:false,
    };
  },
  
  handleClick(tab, event){
      if (tab.name === 'second') {
        this.isSecond = true;
        this.isThird = false;
        this.isFourth =false;
        this.isFifth = false;
      } else if (tab.name === 'third') {
        this.isSecond = false;
        this.isThird = true;
        this.isFourth =false;
        this.isFifth = false;
      }else if (tab.name === 'fourth') {
        this.isSecond = false;
        this.isThird = false;
        this.isFourth =true;
        this.isFifth = false;
      }else if (tab.name === 'fifth') {
        this.isSecond = false;
        this.isThird = false;
        this.isFourth =false;
        this.isFifth = true;
      }
    }
}

这样就可以完美解决上面的问题,首次加载页面只会渲染其中一个tab的内容,同时点击tab切换时页面重新渲染页面。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

this.$nextTick()的使用场景 上一篇
vue中'. native'修饰符的使用 下一篇