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

大家好,我是大澈!

本文约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个专栏内容。

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

相关推荐
旭日猎鹰7 分钟前
Flutter踩坑记录(二)-- GestureDetector+Expanded点击无效果
前端·javascript·flutter
乐闻x42 分钟前
Vue.js 性能优化指南:掌握 keep-alive 的使用技巧
前端·vue.js·性能优化
一条晒干的咸魚44 分钟前
【Web前端】创建我的第一个 Web 表单
服务器·前端·javascript·json·对象·表单
花海少爷1 小时前
第十章 JavaScript的应用课后习题
开发语言·javascript·ecmascript
sinat_384241091 小时前
在有网络连接的机器上打包 electron 及其依赖项,在没有网络连接的机器上安装这些离线包
javascript·arcgis·electron
小牛itbull2 小时前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i2 小时前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
533_2 小时前
[vue] 深拷贝 lodash cloneDeep
前端·javascript·vue.js
GIS瞧葩菜2 小时前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
zhang-zan3 小时前
nodejs操作selenium-webdriver
前端·javascript·selenium