Vue之keep-alive组件

1、有何作用

        有时候我们并不想重复渲染某个组件或者出于对于网站性能优化的原因,希望某个组件的信息可以缓存下来,这时候可以使用keep-alive组件

引自官网

<keep-alive> 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们。和 <transition> 相似,<keep-alive> 是一个抽象组件:它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。 当组件在 <keep-alive> 内被切换,它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。 主要用于保留组件状态或避免重新渲染

2、keep-alive 生命周期

  • 初次进入时:created => mounted => activated;退出后触发 deactivated;
  • 再次进入:会触发 activate,组件每次进去执行的方法都会放在 activated 中。

3、代码示例 

我们需要在路由中设置属性来判断进入的组件是否需要缓存,这时候就要用到我们的路由守卫

<div id="app" class='wrapper'>
    <keep-alive>
        <!-- 需要缓存 --> 
        <router-view v-if="$route.meta.keepAlive"></router-view>
     </keep-alive>
      <!-- 不需要缓存 -->
     <router-view v-if="!$route.meta.keepAlive"></router-view>
</div>

路由中设置相关属性

{
  path: 'list',
  name: 'list',
  component:list
 },
 meta: {
  keepAlive: true,
  title: '列表页'
 }
}

使用beforeEach钩子判断进入组件前是否需要缓存,可以自己设置路由的meta对象中的属性,实现动态缓存

4、记录滚动位置(进阶)

keep-alive虽然可以缓存组件信息,但是并不会记录当前页面的滚动位置,但是他提供了两个生命钩子,我们可以这样实现,看代码。

deactivated () {

//使用localstorge或者sessionstorge都可以
 window.localStorage.setItem("top", JSON.stringify({
 listTop: this.scrollTop
 }))
}

在组件退出的时候,我们将滚动的高度记录并存储在本地存储上,那么当页面进入组件时,我们通过activated钩子去滚动到相应位置

//有的组件没有滚动,有可能我们拿到的值为空,所以需要判断一下

let topdata= window.localStorage.getItem("top")?JSON.parse(window.localStorage.getItem("top") : null



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vuekeep-alive组件是用来进行组件缓存的。它可以在特定的场景下使用,比如需要缓存某个组件或者缓存所有组件。\[1\]要缓存某个组件,可以在该组件的外层嵌套一层<keep-alive>标签,并将需要缓存组件放在<keep-alive>标签内部。例如,在APP.vue缓存NativeBtn组件可以这样写:<keep-alive><NativeBtn /></keep-alive>。\[2\]如果需要缓存所有组件,可以将<keep-alive>标签放在根组件的外层,并将<router-view>放在<keep-alive>标签内部。例如,在APP.vue缓存所有组件可以这样写:<keep-alive><router-view /></keep-alive>。这样,在路由切换时,被缓存组件将会保留其状态,而不会重新渲染。 #### 引用[.reference_title] - *1* [vue中使用keep-alive进行组件缓存(解决组件缓存问题)](https://blog.csdn.net/pipizhou16/article/details/126033711)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [vue缓存组件keep-alive](https://blog.csdn.net/Celester_best/article/details/125418259)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值