Vue中使用key属性控制组件刷新失效问题求助
问题原因与解决方案
问题出在refreshContent不是响应式变量——你用普通let声明的变量,Vue无法追踪它的变化,所以即使你修改了数值,组件的key属性并没有被Vue感知到,自然不会触发组件的卸载和重渲染。
修复步骤:
- 将普通变量替换为Vue的响应式变量
ref,让Vue能够监听其变化 - 修改事件回调中对变量的赋值方式(通过
.value访问)
修改后的完整代码:
<template> <!-- 路由组件出口 --> <!-- v-slot可以获取当前渲染的组件以及路由信息 --> <router-view v-slot="{ Component }"> <transition name="fade"> <!-- 渲染home一级路由的子路由 --> <component :is="Component" :key="refreshContent"/> </transition> </router-view> </template> <script setup lang="ts"> import emitter from "@/utils/emitter"; import { onUnmounted, onMounted, ref } from "vue"; // 改为响应式ref变量 const refreshContent = ref(0) emitter.on('refresh_content', () => { // 通过.value修改ref变量的值 refreshContent.value += 1 console.log(refreshContent.value) }) onMounted(() => { console.log('load') }) onUnmounted(() => { emitter.off('refresh_content') console.log('unload') }) </script> <style scoped> .fade-enter-from { opacity: 0; transform: scale(0) } .fade-enter-to { opacity: 1; transform: scale(1); } .fade-enter-active { transition: all 0.5s; } </style>
额外检查点:
- 确保
emitter的refresh_content事件确实被正确触发(可以在触发按钮的地方加日志验证) - 如果路由组件被
keep-alive包裹,需要额外处理,但你的代码中没有相关逻辑,暂时无需考虑
内容的提问来源于stack exchange,提问作者pengzihao2002
相关产品推荐
相关产品推荐

