vue多次调用生命周期 mounted 多次重复请求 解决方案

博客讲述了在Vue应用中遇到的一个问题,页面中的请求被不正常地多次调用,导致性能下降。经过排查,发现原因是将`router-view`置于循环导航中,从而每次循环都会触发页面加载和`mounted`钩子。解决方案是将`router-view`移出循环,确保只加载一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到了一个百思不得其解的bug,vue的页面会多次调用同一个请求,每个页面调用的次数还不一样,有的调用三次,有的五次,甚至有一个调用了十二次,已经严重影响性能了。第一时间肯定是想大概率请求写到循环里了。然而检查了源码发现并没有。然后考虑是不是页面里的组件触发了请求事件。然而这个页面里根本没有引用组件。请求事件只是写在了mounted里,打印了一下,发现mounted也被多次触发。这冲击了我这个萌新小白的认知,不是明明说好mounted只能触发一次的咩!?只好继续查资料看代码,终于发现了问题所在:

原来是把父页面的router-view写到了循环的导航里,导致导航有多少条,页面就加载了多少次

<el-tabs v-model="activeTab" type="border-card" v-if="activeMenuId && activeMenuId !== '1'">
            <el-tab-pane
              v-for="(menu,index) in subMenu"
              :key="menu.authId"
              :label="menu.authName"
              :name="String(index)"
            >
            <router-view></router-view>
            </el-tab-pane>        
          </el-tabs>

### 解决 Vue 中 `mounted` 生命周期钩子执行多次的问题 #### 原因分析 当遇到 `mounted` 钩子被执行多次的情况时,通常有以下几个可能的原因: - 组件被重复创建和销毁。如果组件所在的路由频繁切换或条件渲染逻辑导致该组件断重新挂载,则每次挂载都会触发一次 `mounted` 函数[^1]。 - 使用了动态组件 (`<component :is="...">`) 或者 `<keep-alive>` 标签未正确配置缓存策略,这可能导致组件卸载后再激活时再次调用 `mounted` 方法[^2]。 - 存在多个相同 ID 的 HTML 元素或者模板定义错误也可能引起此类现象;另外,在开发工具中刷新页面也会造成短暂性的重绘从而影响某些情况下钩子函数的正常工作流程[^3]。 #### 解决策略 针对上述原因可以采取如下措施来解决问题: ##### 优化组件管理方式 对于因为路由跳转等原因造成的反复挂载问题,可以通过调整应用结构减少必要的组件重建次数。比如利用 Vue Router 提供的导航守卫控制进入/离开特定路径前后的操作,确保只有真正需要更新的部分才会发生改变[^4]。 ##### 合理运用 `<keep-alive>` 为了提高用户体验并降低资源消耗,建议对那些经常变动但仍需保持状态的小部件采用 `<keep-alive>` 缓存机制。需要注意的是要设置好 include/exclude 属性以精确指定哪些组件应该被保留下来而必每次都经历完整的生命周期过程[^5]。 ```html <!-- 只缓存名为 'my-component' 的组件 --> <keep-alive include="my-component"> <router-view></router-view> </keep-alive> ``` ##### 检查 DOM 结构与模板语法 仔细审查项目中的静态文件以及视图层代码片段是否存在冲突之处,并修正任何符合语义化的标记写法。此外还可以借助浏览器开发者工具定位具体位置以便更高效地排查潜在隐患。 ##### 调试技巧 通过向 `mounted()` 添加简单的日志记录可以帮助追踪实际运行状况: ```javascript export default { mounted() { console.log('Component has been mounted'); } } ``` 也可以考虑使用 Vue Devtools 来监控整个应用程序的状态变化情况,这对于理解复杂的交互场景非常有用。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值