keep-alive包裹路由router-link(vue2 vue3)

要在 router-view 上添加 keep-alive,您可以使用 Vue Router 的 meta 字段来标记需要缓存的组件,然后将 keep-alive 组件包裹在 router-view 外部。

以下是一个示例:

<template>
  <div>
    <keep-alive>
      <router-view :key="$route.meta.keepAliveKey"></router-view>
    </keep-alive>
  </div>
</template>

<script>
export default {
  beforeRouteUpdate(to, from, next) {
    // 更新 keep-alive 的缓存 key
    if (to.matched.some((record) => record.meta.keepAliveKey)) {
      to.meta.keepAliveKey = from.meta.keepAliveKey + 1;
    }
    next();
  },
};
</script>

在上述示例中,我们将 router-view 包裹在 keep-alive 组件中。然后,通过 meta 字段设置组件的缓存 key。每当路由进行更新时(例如导航到不同的路由),通过 beforeRouteUpdate 钩子更新缓存 key,这样就会触发 keep-alive 的重新渲染。

在路由配置中,您需要为需要缓存的组件添加 meta 字段并给它们设置一个初始的缓存 key 值,如下所示:

const routes = [
  {
    path: '/component1',
    name: 'Component1',
    component: Component1,
    meta: {
      keepAliveKey: 1, // 初始缓存 key
    },
  },
  // 其他路由配置...
];

样,Component1 组件就会被缓存,并且可以根据需要在 keep-alive 组件中保持其状态。

问:这是什么原理 意思是配上keepAliveKey的页面就会被缓存吗?

答复:是的,这种方法是通过 Vue Router 的 meta 字段和 keep-alive 组件来实现组件缓存的功能。

当您给一个路由配置的组件添加 meta 字段,并设置一个 keepAliveKey,这意味着您希望该组件进行缓存。在上述示例中,我们通过 meta 字段的 keepAliveKey 来标识组件是否需要缓存以及缓存的唯一标识。

当路由切换时,beforeRouteUpdate 钩子会被调用。在这个钩子中,我们更新了要进入路由的缓存 key,通过将前一个路由的 keepAliveKey 值加 1 来实现。这样做是为了触发 keep-alive 组件的重新渲染,从而实现缓存的更新。

当一个带有缓存的组件被切换出去,它的状态会被保存在内存中,而不是被销毁。当再次切回该组件时,它的状态将会被还原,从而实现组件缓存的效果。

值得注意的是,并非所有的页面都适合缓存。一些状态会随着时间的推移而改变,或者页面中包含了一些需要即时更新的内容,则不适合通过缓存来实现。因此,您需要根据具体的业务需求来决定哪些页面需要加入缓存。

问: 缓存的更新不等于刷新页面吗

答复:在 Vue.js 应用中,更新缓存并不等同于刷新页面。

当您使用 keep-alive 组件缓存一个页面时,该页面的状态数据在组件销毁之前被保存在内存中。当您再次访问该页面时,组件的状态会被恢复,而不需重新执行 createdmounted 等生命周期方法,并且页面也不会完全刷新。这样可以大大提高页面的加载速度和用户体验。

需要注意的是,缓存的更新是指在页面从缓存中被取出时,重新调用组件的 activated 钩子函数并重新渲染组件,而不是完全刷新页面。这意味着您可以在组件的 activated 钩子函数中处理更新缓存数据的逻辑,而不需要刷新整个页面。

因此,在 Vue.js 应用中使用缓存技术和页面刷新是两种截然不同的概念,它们有着不同的适用场合和使用方法

问:缓存不更新的话 对于页面来说 就需要从头开始渲染是吗

答复:

是的,如果缓存不更新,并且页面被重新加载,那么页面需要从头开始渲染。

当页面被刷新时,所有的组件都会重新创建并重新渲染。这意味着组件的生命周期钩子函数(如 createdmounted 等)会再次执行,组件的数据会重置为初始状态。

如果您使用了 Vue Router 的 keep-alive 组件来缓存某些页面,那么这些页面在被切出去后不会经历重新渲染,它们的状态会被保存在内存中。但是,当您再次切换回这些页面时,如果缓存没有更新,页面仍然需要从头开始重新渲染。

因此,缓存的目的是为了避免重新渲染,提高页面的加载速度和用户体验。但是,如果您希望页面重新渲染并加载最新的数据,那么刷新页面是一个更合适的选择

--------------------------------------------------分割线-----------------------------------------------------------------

上面所述针对vue2项目 vue3的项目写法有所区别:

在 Vue Router 版本 3.x 中,<router-view> 组件不能直接放置在 <transition> 或 <keep-alive> 组件内部,而是需要使用插槽(slot)来替代。

以下是正确的用法:

<router-view v-slot="{ Component }">
  <keep-alive>
    <component :is="Component" />
  </keep-alive>
</router-view>

在上述示例中,我们使用了 <router-view> 的插槽属性(slot props)来获取 Component。然后,我们通过 <component> 动态渲染 Component,同时将其包裹在 <keep-alive> 组件内,以实现对该组件的缓存。

请注意,这里的 :is 属性用于将 Component 动态地渲染为一个组件。确保您已经正确定义了需要被渲染的组件,并在路由配置中指定了相应的组件

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值