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。

相关推荐
清山博客20 小时前
OpenCV 人脸识别和比对工具
前端·webpack·node.js
要加油哦~20 小时前
AI | 实践教程 - ScreenCoder | 多agents前端代码生成
前端·javascript·人工智能
程序员Sunday20 小时前
说点不一样的。GPT-5.3 与 Claude Opus 4.6 同时炸场,前端变天了?
前端·gpt·状态模式
yq19820430115620 小时前
静思书屋:基于Java Web技术栈构建高性能图书信息平台实践
java·开发语言·前端
一个public的class20 小时前
你在浏览器输入一个网址,到底发生了什么?
java·开发语言·javascript
aPurpleBerry20 小时前
monorepo (Monolithic Repository) pnpm rush
前端
青茶36020 小时前
php怎么实现订单接口状态轮询请求
前端·javascript·php
火车叼位21 小时前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
VT.馒头21 小时前
【力扣】2727. 判断对象是否为空
javascript·数据结构·算法·leetcode·职场和发展
鹏北海21 小时前
micro-app 微前端项目部署指南
前端·nginx·微服务