vue3项目 keepAlive 导致的切换tab页问题

今天开发项目过程中发现,打开多个tab详情页后,详情页之间互相切换,数据没有刷新。查看控制台,发现详情页tab之间互相切换时,onActivated钩子函数只运行了一次,后续也并没有发送相应的请求

但是我明明在onActivated钩子函数中调用了数据请求函数,每次激活页面的时候就重新请求数据。

此时,我发现,在其他页面和详情页互相切换时,onActivated钩子函数被成功调用了。

猜想:可能是keepAlive将详情页(同一个组件,路由带的query不同)都视作同一个组件了,所以在详情页之间切换,组件一直都是出于激活状态,只在第一次会调用onActivated钩子函数。

查看代码:

果然,默认的组件名作为区分。

解决办法:给组件绑定key值即可

Vue3 中,如果你想监听 `keep-alive` 组件的 tab 关闭事件,`keep-alive` 是用于缓存组件状态以避免不必要的渲染,它本身并不直接提供 tab 关闭的监听功能。不过,你可以通过一些间接的方式来达到这个目的。 一种常见的做法是在离开面之前调用自定义的方法或者发送一个事件通知其他部分的代码。例如,你可以在路由守卫的 beforeDestroy 钩子里或者一个全局的 Vue 实例上添加事件处理器: ```javascript // 在路由守卫中 router.beforeEach((to, from, next) => { if (from.name && to.meta.isKeepAlive) { // 当从 keep-alive 区域离开时,假设有一个 'closeTab' 的方法 this.$emit('closeTab', to); } next(); }); // 或者在一个全局组件里 new Vue({ el: '#app', mounted() { window.addEventListener('beforeunload', () => { if (this.$route.meta.isKeepAlive) { this.closeTab(); } }); }, methods: { closeTab() { this.$emit('closeTab'); } }, }); ``` 然后在需要监听这个事件的地方,如一个单独的插件或者父组件,你就可以接收并处理这个 `closeTab` 事件: ```javascript // 在某个组件中 export default { created() { this.$on('closeTab', () => { console.log('Tab is closing'); // 在这里可以进一步执行清理操作、保存数据等 }); }, }; ``` 请注意,这种方法依赖于用户主动触发的浏览器卸载事件,不是所有浏览器都支持这个事件,也不是最佳实践,因为它可能会导致性能问题。如果需要更精确地控制 tab切换,通常建议使用 vuex 状态管理库或者专门的 tab 管理库来进行管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值