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

大家好,我是大澈!

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

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

相关推荐
mayaairi2 小时前
JS循环语句深度解析:嵌套for、while与do...while
开发语言·前端·javascript
To_OC2 小时前
啃完流式输出:从一个卡顿的 LLM 接口开始,我搞懂了数据流到底怎么 “流”
前端·javascript·llm
用户059540174465 小时前
用了3年Redis,才发现我一直没搞懂缓存一致性测试
前端·css
海上彼尚6 小时前
Nodejs也能写Agent - 22.LangGraph篇 - 上下文工程
前端·javascript·人工智能·langchain·node.js
muddjsv6 小时前
CSS选择器体系精讲:按身份、结构、状态精准匹配元素(零基础吃透)
前端·css
程序软件分享7 小时前
多语言DAPP综合盘交易所系统源码搭建剖析
vue.js·金融·开源
默_笙7 小时前
🎉 AI 项目里为什么需要 BFF?因为我实在不想在前端处理二进制流
前端·javascript
xyphf_和派孔明9 小时前
企业级微前端项目完整创建步骤,第三步:配置 Vue 子应用
前端·javascript
路光.11 小时前
Vue2升级Vue3处理原 UMD/CommonJS 打包文件,不是标准 ESM
前端·javascript·vue.js·vue3
一只月月鸟呀11 小时前
移动端tap与click的区别 && 点透事件
开发语言·前端·javascript