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

keep-alive是Vue.js中的一个内置组件,用于缓存组件,避免重复渲染和销毁。它有activated和deactivated两个生命周期钩子,分别在组件激活和不活跃时触发。通过include和exclude属性,可以精确控制哪些组件应该被缓存或排除。当遇到缓存后created和mounted不执行的问题时,可以利用activated钩子来执行页面进入时的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

jieyucx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值