vue3项目中页面的前进后退都会重新刷新页面,使用<keep-alive>解决了这个问题,有些页面必须得进入之后刷新数据,所有我又使用了onActivated方法,但是从上一个页面返回到这个页面,还是会触发这个事件,怎么让他只有跳转到这个页面才触发onActivated, 返回到这个页面的不触发呢?
vue3项目中页面的前进后退都会重新刷新页面,使用<keep-alive>解决了这个问题,有些页面必须得进入之后刷新数据,所有我又使用了onActivated方法,但是从上一个页面返回到这个页面,还是会触发这个事件,怎么让他只有跳转到这个页面才触发onActivated, 返回到这个页面的不触发呢?
要实现只有进入页面时触发 onActivated 而返回时不触发,可以通过维护一些状态来区分是首次进入还是返回。
以下是一种可能的实现方式示例:
import { ref } from 'vue';
export default {
setup() {
const isFirstEnter = ref(true);
onActivated(() => {
if (isFirstEnter.value) {
// 在这里执行只有首次进入时要做的事情
isFirstEnter.value = false;
}
});
onDeactivated(() => {
// 当页面离开时,将状态重置为 true,以便下次进入能触发
isFirstEnter.value = true;
});
return {};
},
};
这样,当首次进入页面时,isFirstEnter 为 true 会执行相应逻辑并将其设为 false,而后续返回时由于状态已经是 false 就不会再执行特定动作。当页面再次离开并重新进入时,状态又会被重置为 true 从而能再次触发。
不太明白,如果是跳转到这个页面的话就把逻辑写到onShow
等方法中不就行了?为什么非要写到onActivated
中,这样返回就不会触发,只有跳转才触发。
或这非要都用onActivated
可以用Pinia
来存储一个标识来区别对待。
哦,我以为是uniapp
,纯h5路由确实不好用,想起原先用vant
做时同样遇到过此情况,当时貌似是用keep-alive
的include
来解决的,我找下原先的代码,但是现在也看不太懂当时的逻辑了,建议还是用uniapp
,最少路由这个比vue-router
要好很多,没有你说的这种情况。
根据作者描述看,需求是回退到当前页面不需要刷新数据,重新进入当前页面需要刷新数据。方案是用keep-alive。同时借助keep-alive标签的include的属性,在进入当前页面时修改include的值,使得当前页面组件可以被匹配保持缓存,退出当前页面时,修改include的值,使得当前页面不被匹配。
6 回答2.9k 阅读✓ 已解决
8 回答4.7k 阅读✓ 已解决
6 回答3.4k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
6 回答2.3k 阅读
5 回答6.3k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
首先根据你的描述,你应该是想要解决在路由更改时根据不同的情况来决定是否请求数据.
然后说下你遇到的问题,使用了keep-alive,但是不想触发对应的onActivted方法,这是不行的.因为对应的钩子函数是在组件整个生命周期当中的一环,既然已经是了缓存组件,那么一定会触发对应的缓存组件的钩子.
我提供了几种思路: