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。

相关推荐
赖龙4 分钟前
pnpm vs npm
前端·npm·node.js
To_OC25 分钟前
LC 239 滑动窗口最大值:从暴力超时到单调队列一遍过
javascript·算法·leetcode
学如逆水,不进则退1 小时前
在线免费音频剪辑:NBTools 可视化波形裁剪 MP3/WAV,本地处理免上传
前端·音视频
Mh1 小时前
虚拟滚动真的比普通滚动性能更好吗?
前端·javascript·性能优化
pe7er1 小时前
React + Ant Design 中的 IME (输入法合成)安全输入组件
前端
Super 含2 小时前
Android 启动优化(二):TTID、TTFD 与 Macrobenchmark 启动性能测量
前端
Python私教2 小时前
别急着加 llms.txt:企业官网面向 AI 搜索的工程清单
前端·人工智能·seo
东方小月2 小时前
从零开发一个 Coding Agent(十三):实现安全的 read 文件读取工具
前端·人工智能·全栈
东方小月3 小时前
从零开发一个 Coding Agent(十二):实现版本化 JSONL 与真实 CLI 入口
前端·设计模式·前端框架
FL16238631294 小时前
室内易燃物识别易燃评估室内易燃程度识别分割数据集labelme格式1015张85类别
java·服务器·前端