vue -- 按需加载Tabs,重新渲染公共组件(给router-view 组件的 绑定 key 的原因)

如图,最近在做Tabs切换,发现一进来渲染所有Tabs组件时页面卡慢,所以我选择用切换子路由的方式来按需加载子组件的内容

<template>
  <div>
    <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick">
        <el-tab-pane name="users" label="用户管理">   
        </el-tab-pane>
        <el-tab-pane name="peizhi" label="配置管理">
        </el-tab-pane>
        <el-tab-pane name="payment" label="角色管理">
        </el-tab-pane>
        <el-tab-pane name="plan" label="定时任务补偿">
        </el-tab-pane>
    </el-tabs>
    <router-view></router-view>
  </div>
</template>
<script>
export default {
  name: "item",
  data() {
      return {
        activeName: 'users'
      };
  },
  mounted(){
    let url = this.$route.fullPath;
    let index = url.lastIndexOf("\/");
    let str = url.substring(index + 1,url.length);
    console.log(str,666);
    this.activeName = str;
  },
  methods: {
    handleClick(tab, event) {
      this.$router.push('/item/manage/'+tab.name)
    }
  }
  
}
</script>

问题:然而刷新发现Tab栏不会被重新渲染,没有走created,mounted,于是在外围的Main.vue 的标签router-view添加了key

<template>
  <div class="main-content">
    <!-- <hh-bread></hh-bread> -->
    <router-view :key="key" class="router-view" />
  </div>
</template>
computed: {
    key() {
      // 组件被强制不复用,重新渲染,绑定 key 的原因
      console.log(this.$route.fullPath);
      return this.$route.fullPath
    }
  }

1. 设置 router-view 的 key 属性值为 $route.path

从/page/1 => /page/2, 由于这两个路由的$route.path并不一样, 所以组件被强制不复用, 相关钩子加载顺序为:
beforeRouteUpdate => created => mounted

从/page?id=1 => /page?id=2, 由于这两个路由的$route.path一样, 所以和没设置 key 属性一样, 会复用组件, 相关钩子加载顺序为:
beforeRouteUpdate

2. 设置 router-view 的 key 属性值为 $route.fullPath

从/page/1 => /page/2, 由于这两个路由的$route.fullPath并不一样, 所以组件被强制不复用, 相关钩子加载顺序为:
beforeRouteUpdate => created => mounted

从/page?id=1 => /page?id=2, 由于这两个路由的$route.fullPath并不一样, 所以组件被强制不复用, 相关钩子加载顺序为:
beforeRouteUpdate => created => mounted

 

posted @ 2020-12-12 15:15  童话里都是骗人的  阅读(2370)  评论(0编辑  收藏  举报