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。

相关推荐
kyriewen20 小时前
手写 call、apply、bind:从原理到实现,附 3 个最容易忽略的边界情况
前端·javascript·面试
用户21816970493020 小时前
swift (三) 枚举 结构体 类
前端
胡萝卜术20 小时前
从内存视角重新认识 JavaScript 数据类型:一份深度学习笔记
前端·javascript·面试
IVEN_20 小时前
记一次诡异的前端白屏故障:Nginx Proxy Cache 内存缓存"幽灵"事件
前端·nginx
如果超人不会飞20 小时前
TinyRobot SuggestionPills紧凑的建议按钮组组件
前端·vue.js
如果超人不会飞20 小时前
TinyRobot Container构建优雅的AI对话容器
前端·vue.js
幸运小圣20 小时前
全面解析 Web 核心性能指标:LCP、INP、CLS 是什么、怎么用、怎么看
前端
如果超人不会飞20 小时前
TinyRobot SuggestionPopover智能建议弹出框组件
前端·vue.js
LiuJun2Son20 小时前
Angular 快速入门:从零搭建你的第一个应用
前端·javascript·angular.js
烬羽20 小时前
从零理解树与二叉树:用 JS 带你手撕遍历和递归
javascript·数据结构