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

大家好,我是大澈!

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

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

相关推荐
M--Y7 小时前
LangGraph 工作流模式
开发语言·javascript·python·langchain·大模型·llm·langgraph
johnjincaaaa12 小时前
猿人学第 18 题「jsvmp 洞察先机」逆向通关实录
javascript·后端
FungLeo14 小时前
成为全栈·Vue 管理后台篇·分类树与标签管理:层级数据如何落到管理界面
前端·javascript·vue.js·分类树·naive ui·标签管理·前端数据结构
总要学点什么15 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
ruanno_top18 小时前
选中一项后,焦点掉回了页面顶部:三个弹层的焦点还原
vue.js
小厨勺子18 小时前
我用AIUI给Rokid眼镜做了个随身换算智能体
javascript
夕水20 小时前
我用trae重构了ew-color-picker,一个插件化架构的现代颜色选择器
前端·javascript·开源
tryCbest20 小时前
Vue3——第 17 篇:模板引用(ref)与组件实例——操作 DOM 的正确姿势
vue.js·前端搭建
头发还在的女程序员21 小时前
Java在线租房系统源码解析:Spring Boot+Vue 3+UniApp房源管理与预约看房方案
java·vue.js·spring boot·租房小程序·租房系统·租房软件
FYKJ_201021 小时前
springboot同人周边订单管理系统48955-计算机毕业设计、课程设计
java·javascript·vue.js·spring boot·django·php·课程设计