gpt4 book ai didi

vue监听路由变化时watch方法会执行多次的原因及解决

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 32 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章vue监听路由变化时watch方法会执行多次的原因及解决由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

本人前端菜鸟一名,一直致力于不间断的生产管理后台的bug,并以此自勉自励。近几天接到一个需求,网上也搜了很多例子,但是没有从根本上解决。在这里记录一下我自己的解决的过程,这也是第一次在掘金发言,求轻虐.

需求描述:

有A、B两个页面,需要将A页面的orderId用路由传参的方式传入到B页面执行数据关联查询,然后显示在B页面 。

需求解析:

如果是你,你拿到这个需求,应该很容易想到在B页面对路由变化做watch,然后获取参数执行查询数据的方法完事.

解决需求

A页面中:

?
1
2
3
4
5
6
7
8
const route = {
         name: 'BpageName' ,
         params: { orderId: this .tableData[index].id },
         meta: {
           title: 'B页面'
         }
       }
this .$router.push(route)

push一个路由重新打开B页面 。

然后B页面中接受路由传参:

?
1
2
3
4
5
6
@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页面 。

?
1
2
3
if ( this .$route.fullPath === 'A页面路由路径' ) {
     // do something
}

怀着激动的心情去试了试 。

?
1
2
3
4
5
6
@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().

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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就去获取数据.

?
1
2
3
4
5
6
7
8
9
10
11
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 ;
}

大功告成,终于解决了。大佬们求轻吐槽代码,有更好的意见或建议,欢迎评论留言指导.

以上就是vue监听路由变化时watch方法会执行多次的原因及解决的详细内容,更多关于vue watch方法会执行多次的原因及解决的资料请关注我其它相关文章! 。

原文链接:https://juejin.cn/post/6948684670225940487 。

最后此篇关于vue监听路由变化时watch方法会执行多次的原因及解决的文章就讲到这里了,如果你想了解更多关于vue监听路由变化时watch方法会执行多次的原因及解决的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com