vue路由在使用keep-alive缓存之后第二次进入页面created和mounted不执行问题及解决

一、keep-alive介绍

1. 什么是 keep-alive?

Vue.js keep-alive 是一个内置组件,可以在需要缓存的组件上添加keep-alive 标签,使得这个组件被缓存起来,不会被多次渲染和销毁。keep-alive 组件有两个独立的生命周期钩子,分别是 activateddeactivated

2. 如何使用 keep-alive?

在需要缓存的组件外部添加一个 keep-alive 标签,示例如下:

<template>
  <div>
    <keep-alive>
      <router-view></router-view>
    </keep-alive>
  </div>
</template>

这个例子中,我们将路由组件放到 keep-alive 标签内部,实现路由组件的缓存。

3. keep-alive 的作用

使用keep-alive可以有效地提高应用的性能。因为在组件被缓存的时候,即使组件被切换出去,它的状态依旧被保留。当再次切换到被缓存的组件时,不需要重新渲染和初始化组件,可以直接复用缓存的组件,从而加快页面的响应速度。

除此之外,还可以结合 activateddeactivated生命周期钩子实现一些额外的功能。例如,在组件离开缓存页面时,使用 deactivated 钩子进行数据的清理和状态的重置。当组件再次出现在缓存页面时,使用 activated 钩子进行数据的恢复和状态的还原

4. keep-alive的include和exclude

  • include:用于指定哪些组件需要被缓存,可以是组件名称一类的标识符,也可以是使用正则表达式进行匹配。在keep-alive中存在的缓存组件只有包含在include中才会被缓存,否则会被销毁。
  • exclude:用于指定哪些组件不需要被缓存,同样可以使用标识符或正则表达式进行匹配。在keep-alive中存在的缓存组件中,如果包含在exclude中,则不会被缓存,而是每次都需要重新创建。

例如,我们可以在使用keep-alive组件时,使用includeexclude来控制缓存浏览的页面。例如,在下面的代码中,我们可以指定只有HomeAbout两个组件才会被缓存:

<keep-alive :include="['Home', 'About']">
  <router-view></router-view>
</keep-alive>

而如果我们不想缓存某个组件,比如Login组件,我们可以使用exclude来指定这个组件:

<keep-alive :exclude="'Login'">
  <router-view></router-view>
</keep-alive>

当然,也可以使用正则表达式来进行匹配,例如:

<keep-alive :include="/^Home/">
  <router-view></router-view>
</keep-alive>

这段代码将会缓存以Home开头的所有组件。同时,我们也可以给includeexclude传递一个函数,该函数会在组件激活时被调用,根据返回值来确定组件是否被缓存。例如:

<keep-alive :include="component => component.name === 'Home'">
  <router-view></router-view>
</keep-alive>

这个例子中,只有组件名称为Home的组件才会被缓存。

二、缓存之后第二次进入页面created和mounted不执行问题及解决

这两个钩子不执行是应为咱得路由用了keep-alive缓存了,想要让其执行你可以直接去掉缓存就行了

<keep-alive :exclude="'Login'">
  <router-view></router-view>
</keep-alive>

就如上述代码,这样login页面中每次进入页面都会再次执行created和mounted

但是,有的场景是需要缓存,并且每次我们进入页面又得执行一些逻辑,这时用上述方式就不太符合需求,咱可以用activated钩子函数

直接将要处理的逻辑放在activated中就可以了,这样每次进入页面都会重新执行
用法和其他的生命周期钩子一样,直接加就行了。

activated() {
	console.log('要处理的逻辑')
}

在上面已经介绍了keep-alive 组件有两个独立的生命周期钩子,分别是 activateddeactivated

  • activated 当组件被激活(使用)的时候触发 可以简单理解为进入这个页面的时候触发
  • deactivated 当组件不被使用(inactive状态)的时候触发 可以简单理解为离开这个页面的时候触发

这两个有点类似页面的生命周期mountedbeforeDestroy钩子

created,mounted,activated,deactivated钩子函数的执行顺序如下:

  • 初始进入和离开 created —> mounted —> activated --> deactivated
  • 后续进入和离开 activated --> deactivated
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue 3中,`keep-alive`组件具有两个新增的生命周期钩子函数:`activated`和`deactivated`。当组件被缓存并重新激活时,`activated`函数会被调用;当组件被缓存并离开时,`deactivated`函数会被调用。这两个钩子函数允许我们在组件被缓存和激活/离开时执行相应的逻辑操作。除了新增的生命周期钩子函数,`keep-alive`组件仍然会遵循普通的Vue组件的生命周期顺序,例如`created`、`mounted`、`updated`和`destroyed`等。所以在使用`keep-alive`组件时,可以根据需要在这些生命周期函数中进行相应的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Vue生命周期(keep-alive缓存特殊activated(组件激活时)、deactivated(组件停用时))、父子组件的执行顺序](https://blog.csdn.net/muzidigbig/article/details/112696398)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Vue缓存路由keep-alive)以及新的生命周期](https://blog.csdn.net/code_dream_wq/article/details/128713825)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jieyucx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值