zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    移动端页面使用rem布局
    Vue2.0 render:h => h(App)
    sublime3 快捷键大全
    node-webkit学习之【无边框窗口用JS实现拖动改变大小等】
    mock.js-无需等待,随机产生数据,让前端独立于后端进行开发
    Sublime Text 3 遇到的一些小坑的解决方法
    Angular Cli 升级到最新版本
    Angular 表单嵌套、动态表单
    angular6 iframe应用
    JS 时间格式 相互转化
  • 原文地址:https://www.cnblogs.com/juewuzhe/p/14124779.html
Copyright © 2011-2022 走看看