【vue3+ts】keep-alive缓存组件,路由跳转后,返回旧的页面依旧保留之前的数据及浏览位置。
·
一、 KeepAlive的含义
<KeepAlive>包裹动态组件时,会缓存不活跃的组件实例,而不是销毁它们。任何时候都只能有一个活跃组件实例作为
<KeepAlive>的直接子节点。当一个组件在
<KeepAlive>中被切换时,它的activated和deactivated生命周期钩子将被调用,用来替代mounted和unmounted。这适用于<KeepAlive>的直接子节点及其所有子孙节点。
上面一段是官网的解释。简单理解就是缓存组件的,不加它每次访问组件都会重新创建,重新创建也就意味着数据初始化,路由跳转走之后就会摧毁。
二、场景
我的场景是在首页有个点击‘更多’来路由跳转到列表页面。当我从列表页返回到首页时,页面重新刷新了。需求:要求返回首页时保留之前的数据
三、缓存组件
在App.vue里
<template>
<router-view v-slot="{Component}">
<transition name="router-fade" mode="out-in">
<keep-alive>
<component :is="Component"/>
</keep-alive>
</transition>
</router-view>
</template>
router/index.js(ts)

{
path: '/',
name: 'home',
component: () => import('../views/Scene.vue'),
meta:{
keepAlive:true
}
},
此时你的页面可能会有一个警告: <Transition>中的组件呈现不能动画化的非元素根节点。

因为 <Transition>包裹组件的原因,组件内必须只有一个跟节点。所以在组件内用个div标签包裹即可

四、保留之前滚动位置
在返回的首页里
//定义变量
const placeScroll=ref()
onBeforeRouteLeave((to, from, next) => {
//在路由跳转之前,对当前浏览位置进行保存
placeScroll.value = document.documentElement.scrollTop
next()
})
//组件激活
onActivated(() => {
if (placeScroll.value != null && placeScroll.value > 0) {
//组件激活后进行浏览位置的赋值
document.documentElement.scrollTop = placeScroll.value
document.body.scrollTop = placeScroll.value
}
})
这样返回到首页时显示的就是之前的页面效果啦
此时还会出现一个问题,就是当我在首页浏览到一定位置后,点击“更多”,路由跳转到列表页面的位置和首页的位置一样。按理说我跳转一个新页面应该在顶部。此时在你跳转的页面里写一段这样的代码即可
//组件激活
onActivated(()=>{
//组件激活后把页面位置设置为0即可
document.documentElement.scrollTop = 0
document.body.scrollTop = 0
})
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)