vue3中vue router4下使用keep-alive

阅读数:147 评论数:0

跳转到新版页面

分类

html/css/js

正文

缓存页面主要Jul为了防止重复渲染dom,减少加载时间及性能消耗,提高用户体验。

一、旧版的语法

<keep-alive>
    <router-view v-if="$route.meta.keepAlive"></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"></router-view>

二、新版

1、方式一

  <router-view v-slot="{ Component }">
    <keep-alive v-if="$route.meta.keepAlive">
      <component :is="Component" >
        <p>缓存页面</p>
      </component>
    </keep-alive>
    <component :is="Component" v-if="!$route.meta.keepAlive">
      <p>没有缓存的页面</p>
    </component>
  </router-view>

假如A、B为缓存页面,C不是缓存页面,A、B间跳转不会有问题,但A、B跳转C页面再返回时,缓存页会失效一次,这样可能和我们所预期的效果不太一样。

2、方式二

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

</template>
 
<script lang="ts">
//使用动态include解析
//app.vue文件
  export default {
    name: 'App',
    data(){
      return {
        includeList : []
      }
    },
    watch:{
      $route(to:any) {
        //监听路由变化,把配置路由中keepAlive为true的name添加到include动态数组中
        const that:any = this;
        if(to.meta.keepAlive && that.includeList.indexOf(to.name) === -1){
          that.includeList.push(to.name);
        }
      }
    }
  }
</script>

三、keepalive不会刷新后台数据

在 Vue 应用中,使用 <keep-alive> 包裹 <router-view> 可以使得组件状态在用户浏览时保持不变,这意味着组件的生命周期钩子不会重新被触发,因此任何在 mounted 或 created 钩子中进行的数据获取操作不会在组件缓存后重新执行。

如果你需要在每次路由切换时刷新后台数据,即使组件被 <keep-alive> 缓存,有几种方法可以做到这一点:

1、监听路由变化

你可以在 setup 函数中或者在组件的其他生命周期钩子中使用 watch 来监听 $route 对象的变化,并在变化时重新获取数据。

import { watch } from 'vue';
import { useRoute } from 'vue-router';

export default {
  setup() {
    const route = useRoute();
    const fetchData = async () => {
      // 假设 getData 是一个获取数据的异步函数
      const data = await getData();
      // 更新你的数据状态
    };

    // 在 setup 中立即调用一次获取初始数据
    fetchData();

    // 监听路由变化
    watch(() => route.path, () => {
      fetchData();
    });

    return {
      // ...
    };
  },
};

2、使用导航守卫

你可以在路由器配置中使用导航守卫,比如 beforeEach 或 beforeRouteEnter,在路由切换时触发数据更新。

const router = createRouter({
  // ...其他路由配置
});

router.beforeEach((to, from, next) => {
  if (to.path !== from.path) {
    // 假设 store.dispatch 是 Vuex 中触发 action 的方法
    store.dispatch('fetchData');
  }
  next();
});

3、使用activated钩子

对于使用 <keep-alive> 缓存的组件,每次激活(即显示到屏幕上)时,都会触发 activated 钩子。你可以在这个钩子中重新获取数据。

export default {
  // ...
  activated() {
    this.fetchData();
  },
  methods: {
    async fetchData() {
      // 获取数据的逻辑
    },
  },
};

4、使用deactivated钩子

与 activated 钩子相对,deactivated 钩子在组件每次被 <keep-alive> 缓存移除时触发。你可以在 deactivated 钩子中进行清理操作,比如取消正在进行的 API 请求。

export default {
  // ...
  deactivated() {
    // 清理操作,比如取消 API 请求
  },
};



相关推荐

一、基本使用 如果在一个模块化工程中使用它, 必须要通过Vue.use()明确地安装路由功能. const router = new VueRouter({ routes: [ { pat

1、query要用path来引入,接收参数都是this.$route.query.name。query类似于ajax中get传参,即在浏览器地址栏中显示参数。<

一、概念 keep-alive是Vue的内置组件,当它包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和transition相似,keep-alive是一个抽象组件,它

一、生命周期 1、vue2生命周期 beforeCreate #实例初始化之后,进行数据侦听和事件/侦听器的配置之前同步调用 created #实例创建完成后被立即同步调用 beforeMount #

一、使用pnpm新建项目 可以使用npm 或yarn或pnpm来初始化Vite项目 pnpm create vite xxx(项目名称) #选择vue #选择js cd xxx (进入项目目录) #安

一、概述 <script setup> 是在单文件组件(SFC)中使用组合式API的编译时语法糖,解决Vue3.0中setup需要频繁将声明的变量、函数以及import引入的内容通过return向外

一、概述 在vue2中,data函数里返回的值直接为响应式,但在vue3中我们需要使用一些函数才能达到这个效果。 setup函数中拿不到vue的this。 二、常用函数 <template> <d

<script> export default { setup() { const func1= () => { console.log("func1");

一、在main.js挂载 import { createApp } from 'vue' import App from './App.vue' import router from './route

一、概述 在vue3中没有$refs这个对象,可以使用如下方法 <template> <div><input type="text" ref="txt1" value="hello" /></div>