vue监听路由变化时watch方法会执行多次的原因及解决
作者:๘࿆꧁༺༼蜡笔小旧༽ 发布时间:2024-05-05 09:10:24
目录
需求描述:
需求解析:
解决需求
问题解决
本人前端菜鸟一名,一直致力于不间断的生产管理后台的bug,并以此自勉自励。近几天接到一个需求,网上也搜了很多例子,但是没有从根本上解决。在这里记录一下我自己的解决的过程,这也是第一次在掘金发言,求轻虐。
需求描述:
有A、B两个页面,需要将A页面的orderId用路由传参的方式传入到B页面执行数据关联查询,然后显示在B页面
需求解析:
如果是你,你拿到这个需求,应该很容易想到在B页面对路由变化做watch,然后获取参数执行查询数据的方法完事。
解决需求
A页面中:
const route = {
name: 'BpageName',
params: { orderId: this.tableData[index].id },
meta: {
title: 'B页面'
}
}
this.$router.push(route)
push一个路由重新打开B页面
然后B页面中接受路由传参:
@Watch('$route.params.packageId')
routeParamsChanged(newParams: any, oldParams: any) :void { // 通过监听传参的变化来重新复制参数
if (newParams) {
this.getList(newParams)
}
}
看起来是不是很简单?
但是问题来了,因为B页面做了keep-alive页面缓存,第一次路由切换的时候routeParamsChanged方法只执行一次,达到了预期效果。但是,如果关闭B页面或者不关闭B页面的情况下再从A页面跳转到B页面的情况下就会触发两次或多次routeParamsChanged方法。
查了很多资料,vue项目watch内的函数重复触发问题 这里有解释造成这种情况的原因。
解决方法1: 判断fullPath是不是A页面
if (this.$route.fullPath === 'A页面路由路径') {
// do something
}
怀着激动的心情去试了试
@Watch('$route')
routeParamsChanged(newParams: any, oldParams: any) :void { // 通过监听传参的变化来重新复制参数
if (newParams === '/Apage') {
this.getList(newParams)
}
}
结果还是不行,routeParamsChanged方法还是会执行两次或多次。 解决方法2 添加一个flag参数来判断页面是否是active状态,使用keep-alive缓存的组件只会触发activated和deactivated事件,所以就在这两个事件触发时把flag置为true和false,只有在flag为true的时候才执行getList()。
private activatedFlag: boolean = false
activated () {
this.activatedFlag = true;
}
deactivated () {
this.activatedFlag = false;
}
@Watch('$route')
routeParamsChanged(newParams: any, oldParams: any) :void { // 通过监听传参的变化来重新复制参数
if (newParams && this.activatedFlag) {
this.getList(newParams)
}
}
这回改解决了吧?结果还是不行,routeParamsChanged方法还是会执行两次或多次。 崩溃ing.........
问题解决
借鉴了上面的解决方法2,最终在activated ()生命周期钩子函数中取实现获取参数且调用获取数据的方法即可,都不用去监听路由的变化,只要获取了this.$route.params.orderId就去获取数据。
private activatedFlag: boolean = false
activated () {
this.activatedFlag = true
if (this.$route.params.orderId && this.activatedFlag) {
this.getList(this.$route.params.orderId)
}
}
deactivated () {
this.activatedFlag = false;
}
大功告成,终于解决了。大佬们求轻吐槽代码,有更好的意见或建议,欢迎评论留言指导。
来源:https://juejin.cn/post/6948684670225940487


猜你喜欢
- 目录一、Python 中的语句1.1什么是声明?1.2什么是表达式1.3简单的赋值语句1.4增强赋值语句二、Python 中的多行语句2.1
- 最近在抓取http://skell.sketchengine.eu网页时,发现用requests无法获得网页的全部内容,所以我就用selen
- 一、很多读者Python安装完成之后,想要下载相关的包,例如:numpy、pandas等Python中这些基础的包,但是,发现pip根本用不
- os.system()和os.popen()概述大家搞python与操作系统交互时,必须掌握的两个方法就是os.system()和os.po
- 开发中偶尔需要判断网络的连通性,没有什么方法比 ping 更直接了当,通常检查网络情况都是运行命令ping www.baidu.com ,查
- 应用场景:1、授权(Authorization)装饰器能有助于检查某个人是否被授权去使用一个web应用的端点(endpoint)。它们被大量
- 冷备份是数据库文件的物理备份,通常在数据库通过一个shutdown normal或shutdown immediate 命令正常关闭后进行。
- 顾名思义, 条件查询就是使用where字句 , 将满足条件的数据筛选出来语法 :select < 结果 > from <
- 本文实例讲述了Python使用装饰器模拟用户登陆验证功能。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-#!p
- 一,前言上篇,主要介绍了在 Vue 的数据初始化流程中,对象属性的单层劫持是如何实现的回顾一下,主要涉及以下几个核心点:data 为函数和对
- 本文详细讲述了python的内嵌time模块的用法。分享给大家供大家参考之用。具体分析如下: 一、简介time模块提供各种操作时
- 平常我们使用js代码获取的时间都是客户端的时间,那么有什么办法在浏览器中显示的是服务器断的时间吗?请看下面代码:<span id=&q
- 最近在使用tensorflow进行网络训练的时候,需要提取出别人训练好的卷积核的部分层的数据。由于tensorflow中的tensor和py
- 所谓的列表推导式,就是指的轻量级循环创建列表。基本使用方式# 创建一个0-10的列表a = [x for x in range(11)]pr
- 最近小编思维发散“Visual Studio可以集成chatgpt吗?”,这样不就可以让chatgp
- Flask提供的模板引擎为Jinja2,易于使用,功能强大。模板仅仅是文本文件,它可以生成任何基于文本的格式(HTML、XML、CSV、La
- 在实际编程开发中,我们会使用到各类的加密算法来对数据和信息进行加密。比如密码中比较常见的MD5加密,以及AES加密等等。对于密码认证来说,M
- 将转储设备加入到SQL Server备份数据库的地方。在SEM中转储设备是可见性的,并且在设备上的信息被存储在主要数据库的sysdevice
- 用mysqlbinlog.exe查看二进制日志是否启用了日志mysql>show variables like 'log%
- SQL SERVER用来判断表或视图存在的语句在ORACLE中不能用,请问该怎么写。谢谢。答案exists(select tnam