一、 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 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐