You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:12:40