vue-router --- keep-alive

342 阅读1分钟

全部使用缓存

在App.vue中加上keep-alive,使之会缓存,避免重新渲染。

<keep-alive>
  <component>
    <!-- 该组件将被缓存! -->
  </component>
</keep-alive>

局部缓存

使用 includeexclude

  • include - 字符串或正则表达,只有匹配的组件会被缓存
  • exclude - 字符串或正则表达式,任何匹配的组件都不会被缓存
<keep-alive include="a">
  <component>
    <!-- name 为 a 的组件将被缓存! -->
  </component>
</keep-alive>可以保留它的状态或避免重新渲染
<keep-alive include="a">
  <component>
    <!-- 除了 name 为 a 的组件将被缓存! -->
  </component>
</keep-alive>可以保留它的状态或避免重新渲染

vue-router优化

router-view 也是一个组件,如果直接被包在 keep-alive 里面,所有路径匹配到的视图组件都会被缓存:

<keep-alive>
  <router-view>
    <!-- 所有路径将被缓存! -->
  </router-view>
</keep-alive>

如果只想某个  router-view 里组件被缓存,需要:

1.使用 includeexclude ,同上

  1. 增加 router.meta 属性 这里只介绍第二种
  • router.js
// routes 配置
export default [
  {
    path: '/',
    name: 'index',
    component: index,
    meta: {
      keepAlive: true // 需要被缓存
    }
  }, {
    path: '/list',
    name: 'list',
    component: list,
    meta: {
      keepAlive: false // 不需要被缓存
    }
  }
]
  • App.vue
<div id="app">
    <keep-alive>
        <router-view v-if="$route.meta.keepAlive">
            <!-- 这里是会被缓存的视图组件,比如 Home! -->
        </router-view>
    </keep-alive>

    <router-view v-if="!$route.meta.keepAlive">
        <!-- 这里是不被缓存的视图组件,比如 Edit! -->
    </router-view>
</div>

优点:不需要例举出需要被缓存组件名称

使用 router.meta 拓展

export default {
        data() {
            return {};
        },
        methods: {},
        beforeRouteLeave(to, from, next) {
             // 设置下一个路由的 meta
            to.meta.keepAlive = true;  // 有缓存,即不刷新
            next();
        }
};
export default {
        data() {
            return {};
        },
        methods: {},
        beforeRouteLeave(to, from, next) {
             // 设置下一个路由的 meta
            to.meta.keepAlive = false;  // 没有缓存,刷新
            next();
        }
};

参考

www.jianshu.com/p/0b0222954…

juejin.cn/post/684490…