vue3中vue router4下使用keep-alive
阅读数:184 评论数: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
一、在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>