vue3 路由缓存导致onMounted无效

在 Vue 3 中,路由组件复用(缓存)可能导致 onMounted 生命周期钩子未被触发。以下是解决方案:

问题原因

当路由路径变化但组件相同时(例如从 /detail/1/detail/2),Vue Router 会复用组件实例,导致:

  1. onMounted 不会重新执行
  2. 组件内部状态保留

解决方案

方案1:强制重新渲染

通过 key 绑定路由路径强制销毁/重建组件:

vue 复制代码
<template>
  <router-view :key="$route.fullPath" />
</template>
方案2:监听路由变化

在组合式 API 中使用 watch 监听路由参数:

vue 复制代码
<script setup>
import { watch, onMounted } from 'vue'
import { useRoute } from 'vue-router'

const route = useRoute()

// 首次加载
onMounted(() => {
  console.log('ID变化:', route.params.id)
  // 数据加载等操作...
})

// 路由参数变化监听
watch(() => route.params.id, (newId) => {
  if (newId) {
     // 数据操作
  }
})
</script>
方案3:使用路由导航守卫

在组件内定义导航守卫:

vue 复制代码
<script setup>
import { onBeforeRouteUpdate } from 'vue-router'

onBeforeRouteUpdate((to, from) => {
  // 处理参数变化逻辑
  loadData(to.params.id)
})
</script>

注意事项

  1. keep-alive 缓存 :若使用 <keep-alive> 包裹路由视图,需配合 onActivated 钩子:

    vue 复制代码
    <script setup>
    import { onActivated } from 'vue'
    
    onActivated(() => {
      // 缓存重新激活时执行
    })
    </script>
  2. 性能权衡:方案1会完全销毁重建组件,频繁切换可能影响性能

建议优先采用方案2或方案3实现数据更新逻辑,仅在必要时使用方案1。

相关推荐
wefly201716 分钟前
m3u8live.cn 在线M3U8播放器,免安装高效验流排错
前端·后端·python·音视频·前端开发工具
C澒1 小时前
微前端容器标准化 —— 公共能力篇:通用打印
前端·架构
德育处主任Pro1 小时前
前端元素转图片,dom-to-image-more入门教程
前端·javascript·vue.js
木斯佳1 小时前
前端八股文面经大全:小红书前端一二面OC(下)·(2026-03-17)·面经深度解析
前端·vue3·proxy·八股·响应式
陈天伟教授1 小时前
人工智能应用- 预测新冠病毒传染性:04. 中国:强力措施遏制疫情
前端·人工智能·安全·xss·csrf
叫我一声阿雷吧2 小时前
JS 入门通关手册(23):JS 异步编程:回调函数与异步本质
javascript·es6·前端面试·回调函数·回调地狱·js异步编程·异步本质
zayzy2 小时前
前端八股总结
开发语言·前端·javascript
今天减肥吗2 小时前
前端面试题
开发语言·前端·javascript
Rabbit_QL2 小时前
【前端UI行话】前端 UI 术语速查表
前端·ui·状态模式
小码哥_常2 小时前
一文带你吃透Android BLE蓝牙开发全流程
前端