【vue3+ts】keep-alive缓存组件,路由跳转后,返回旧的页面依旧保留之前的数据及浏览位置。
vue
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
项目地址:https://gitcode.com/gh_mirrors/vu/vue
免费下载资源
·
一、 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
})
GitHub 加速计划 / vu / vue
82
16
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:4 个月前 )
9e887079
[skip ci] 2 个月前
73486cb5
* chore: fix link broken
Signed-off-by: snoppy <michaleli@foxmail.com>
* Update packages/template-compiler/README.md [skip ci]
---------
Signed-off-by: snoppy <michaleli@foxmail.com>
Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 6 个月前
更多推荐
已为社区贡献6条内容
所有评论(0)