如何去保证一个组件的状态

image.png

  1. <!-- vue2.x配置 -->
  2. <keep-alive>
  3. <router-view v-if="$route.meta.keepAlive" />
  4. </keep-alive>
  1. <router-view v-slot="{ Component }">
  2. <keep-alive>
  3. <component :is="Component" v-if="$route.meta.keepAlive"/>
  4. </keep-alive>
  5. <component :is="Component" v-if="!$route.meta.keepAlive"/>
  6. </router-view>

key重复问题

https://github.com/vuejs/core/issues/1865
image.png

业务组件使用

路由配置-路由中配置好需要缓存的实例

  1. {
  2. path: "/finance/difference",
  3. name: "Difference",
  4. meta: {
  5. title: "差错处理",
  6. keepAlive:true,
  7. auth: 27,
  8. },
  9. component: () => import(/* @vite-ignore */ "@/views/finance/difference/index.vue"),
  10. },
  11. {
  12. path: "/finance/processing",
  13. name: "Processing",
  14. meta: {
  15. title: "长款处理",
  16. keepAlive:true,
  17. auth: 136,
  18. },
  19. component: () => import(/* @vite-ignore */ "@/views/finance/processing/list.vue"),
  20. },


layout

引入组件实例的方式, 用keep-alive包裹

  1. <router-view v-slot="{ Component }">
  2. <keep-alive>
  3. <component
  4. :is="Component"
  5. :key="$route.fullPath"
  6. v-if="$route.meta.keepAlive"
  7. />
  8. </keep-alive>
  9. <component
  10. :is="Component"
  11. :key="$route.fullPath"
  12. v-if="!$route.meta.keepAlive"
  13. />
  14. </router-view>

这里注意keep-alive ,有属性max,可以设置最大缓存组件数量,这里没有加限制

此时组件缓存已经生效,但是在组件业务的切换时,不会自动刷新请求

监听路由去控制请求(可用,不推荐)

  1. import { onBeforeRouteUpdate } from "vue-router";

onActivated特殊周期(可用,推荐)

  • 页面第一次进入的时候,钩子触发的顺序是created->mounted->activated,所以别在mounted和activated方法中写相同的逻辑代码
  • 多页面缓存需要配置key属性,来表示组件的唯一性和对应关系,如::key=”$route.path”
  • 不要动态修改meta.keepAlive的值控制是否缓存,因为第一次是创建组件,没有缓存,需要缓存后,下一次进入才不会触发逻辑代码,如果最开始进入的时候meta.keepAlive值为false的话,渲染的是没有使用keep-alive的组件,则会触发相应代码
  1. onActivated(() => { // 被包裹组件被激活的状态下触发
  2. // 逻辑代码
  3. }
  4. onDeactivated(() => { // 在被包裹组件停止使用时触发
  5. // 逻辑代码
  6. })