功能问题:如何解决跳同一路由组件时页面不变?

大家好,我是大澈!

本文约1100+字,整篇阅读大约需要2分钟。

感谢关注微信公众号:"程序员大澈",免费领取"面试礼包"一份,然后免费加入问答群,从此让解决问题的你不再孤单!

1. 需求分析

Vue中,偶尔会遇到一个很奇怪的问题。

当我们多次使用 router.push() 方法,向同一路由组件跳转时。

此时,如果只是传入的参数不同,就会出现 url 地址变了,但是页面没有重新请求数据、生命周期函数未调用、页面未重新渲染等问题。

最后,我们需要手动刷新一下页面,才会有页面内容的更新。

没听明白问题?没关系,下面看一下该问题的动画演示

如下图,当点击详情1按钮,跳转到详情1组件,并显示内容为携带的参数1。然后,再点击详情2按钮,跳转到详情2组件,并显示内容为携带的参数2。

此时问题出现了,点击详情2按钮时,虽然地址栏中的路由变化了,但是组件的内容仍然显示的是上次跳转携带的参数1

看到这个问题,可能对于一些朋友来说,比较简单,此时欢迎你的指教与补充。

然后下面,我们就一起来聊聊该问题的原因,以及盘点一下该问题解决的几种常见方式。

2. 问题实现

先来聊聊该问题的原因,再分开说一下该问题几种常见解决方式的实现。

下面所有实现示例,都是Vue3代码

2.1 问题原因

Vue Router 默认情况下,会复用相同组件的实例,而不是销毁和重新创建它们。

这种复用的机制可以提高性能,并且在大多数情况下是符合预期的。

/Details/1 => /Details/2 或者 /Details?id=1 => /Details?id=2 ,这类链接跳转时, 原来的组件实例会被复用。

因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用,进而导致页面不再被更新。

2.2 方式一 在路由入口上添加key

这个方式我觉得是最好用的。

这个要写在相同的那个路由组件的路由入口处。

ini 复制代码
<RouterView :key="route.fullPath" />

2.3 方式二 watch监听路由变化

这个要写在相同的那个路由组件中。

javascript 复制代码
watch(route, (to) => {
    // 这里写要更新的东西
}, {immediate: true})

2.4 方式三 使用路由守卫

使用7种路由守卫,这里我只尝试了其中一个。

这个要写在相同的那个路由组件中。

javascript 复制代码
router.beforeEach((to, from, next) => {
    // 这里写要更新的东西
    next()
})

2.5 小结

Vue Router 默认情况下,会复用相同组件的实例,而不是销毁和重新创建它们。

所以会出现,多次跳转同一路由组件时页面不更新的问题。

解决方式有如下几种:

方式一,在router-view上添加key。这个方法比较简单,推荐。

方式二,watch监听路由变化。

方式三,使用路由守卫。

当然,该问题的解决方法肯定还有很多,欢迎朋友们补充!

结语

建立这个平台的初衷:

  • 打造一个专注于前端功能问题的问答平台,让大家高效搜索处理同样问题。
  • 遇到有共鸣的问题,与众多同行朋友们一起讨论,一起沉淀成长。
  • 平台现拥有功能问题、技术资讯、实用干货3个专栏内容。

感谢关注微信公众号:"程序员大澈",免费领取"面试礼包"一份,然后免费加入问答群,从此让解决问题的你不再孤单!

相关推荐
顾安r1 小时前
11.8 脚本网页 星际逃生
c语言·前端·javascript·flask
im_AMBER2 小时前
React 17
前端·javascript·笔记·学习·react.js·前端框架
一雨方知深秋2 小时前
2.fs模块对计算机硬盘进行读写操作(Promise进行封装)
javascript·node.js·promise·v8·cpython
街尾杂货店&4 小时前
css - 实现三角形 div 容器,用css画一个三角形(提供示例源码)简单粗暴几行代码搞定!
前端·css
顺凡4 小时前
删一个却少俩:Antd Tag 多节点同时消失的原因
前端·javascript·面试
小白路过4 小时前
CSS transform矩阵变换全面解析
前端·css·矩阵
前端大卫4 小时前
动态监听DOM元素高度变化
前端·javascript
Cxiaomu5 小时前
React Native App 图表绘制完整实现指南
javascript·react native·react.js
qq. 28040339845 小时前
vue介绍
前端·javascript·vue.js
Mr.Jessy5 小时前
Web APIs 学习第五天:日期对象与DOM节点
开发语言·前端·javascript·学习·html