首页 > 其他分享 >多路由复用页面组件问题

多路由复用页面组件问题

时间:2022-08-27 22:39:32浏览次数:76  
标签:调用 复用 beforeRouteUpdate 组件 路由 页面

本文围绕 Vue Router 中路由组件复用问题展开

场景复现

项目中经常会遇到增改查的需求,通常采用不同的路由指向同一个页面组件,以此到达复用页面的功能,但是复用页面存在一些状态问题。

以下情况均不缓存页面:

分两种情况,均为动态路由匹配

  • (1) 路由a: /detail/1, 路由b: /detail/2 。 路由表里匹配/detail/:id

  • (2) 路由A: /new-detail/1, 路由B: /edit-detail/1 。 路由表里匹配/new-detail/:id, 和 /edit-detail/:id

这四个不同的url,注册的是同一个页面组件

在场景(1)中,切换页面,只调用beforeRouteUpdate钩子函数,不调用beforeRouteEnter、mounted等,可以监听到$route,并获取到激活组件里面的数据,不会错乱

在场景(2)中,切换页面,调用beforeRouteEnter钩子函数,不调用created、mounted等生命周期钩子

beforeRouteUpdate重用的组件官方解释(指的是动态路由匹配)

在当前路由改变,但是该组件被复用时调用,举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1/foo/2 之间跳转的时候

动态路由匹配

文档请看这里

响应路由参数的变化

当使用路由参数时,例如从 /user/foo 导航到 /user/bar,原来的组件实例会被复用。因为两个路由都渲染同个组件,比起销毁再创建,复用则显得更加高效。不过,这也意味着组件的生命周期钩子不会再被调用。

复用组件时,想对路由参数的变化作出响应的话,有两种方法

  1. watch (监测变化) $route 对象

  2. 使用 2.2 中引入的 beforeRouteUpdate 导航守卫

使用beforeRouteUpdate的时候,如果路由里面通过布尔模式props: true 将组件和路由解耦,这个时候会出现props获取错误的情况,比方说从/foo/1页面切换到/foo/2页面的时候,在beforeRouteUpdate获取到的还是失活页面组件的id

beforeRouteUpdate钩子中,在next回调函数中编写代码并没有执行,仿佛没有调用,但是去掉next(),路由就不会放行,有点奇怪。需要阅读源码实现逻辑...

完整的导航解析流程

  1. 导航被触发

  2. beforeRouteLeave(失活组件里调用) 可以访问组件实例 this

  3. beforeEach(全局前置钩子)

  4. beforeRouteUpdate(如果是重用组件,则调用) 可以访问组件实例 this

  5. beforeEnter(路由配置里,路由独享的)

  6. 解析异步路由组件(如果有)

  7. beforeRouteEnter(被激活组件里调用)

  8. beforeResolve(全局解析守卫)

  9. 导航被确认

  10. afterEach(全局后置钩子)

  11. 触发 DOM 更新。

  12. beforeRouteEnter (调用守卫中传给 next 的回调函数,创建好的组件实例会作为回调函数的参数传入。next(vm) => {})

接着调用created、mounted等等


标签:调用,复用,beforeRouteUpdate,组件,路由,页面
From: https://www.cnblogs.com/all-smile/p/16631658.html

相关文章

  • Chapter2 登录和注册_页面之间的数据传递_云储存
    Chapter21.登录和注册(手机验证)1.1我的页面app.jsApp({​ /** *当小程序初始化完成时,会触发onLaunch(全局只触发一次) */ onLaunch:function(){......
  • 在使用element plus中select组件 关于下拉框位置偏移的解决方法
    造成原因:缩放屏幕时,下拉框会随着屏幕的缩放而偏移解决办法:el-select标签中使用popper-class设置teleported=“false”,再去修改你的样式到正确的位置上<el-select......
  • RabbitMQ web管理页面正常访问,但是使用程序连接被拒绝
    软件版本Windowsserver2012R2 RabbitMQ版本3.6.14erlang版本20.3问题描述按照安装教程安装后,web管理页面可以正常访问,也可以设置新用户及其权限,端口监听显示正常。......
  • vue组件中的data为什么是一个函数?
    为什么data为什么是一个函数而不是一个对象?原因是因为如果data是一个对象的话,两个组件中设置的data都会引用同一个内存地址,而用函数的话,则会在每次引用的时候返回一个新的......
  • 幂等公共组件
    前言今天想聊一聊幂等相关的知识,以及实现一个幂等公共组件需要重点涉及和思考的点。概念首先,什么是幂等,在实际代码生产过程中有什么作用呢?在编程中一个幂等操作的特点......
  • vue使用组件<el-date-picker>报错:Avoid mutating a prop directly since the value will
    Vue使用element-ui组件库中的<el-data-picker>标签报错报以下错误,最开始我以为是props通信的问题,但后来发现是版本出现问题导致的解决办法:版本2.14.1的版本已经都不可......
  • 7、软件复用 - 软件技术系列文章
        软件复用主要是为了解决在实际的软件开发过程中重复的工作,在其它软件功能相同或相近的时候,直接将代码放过去然后进行下修改即可。这个也是参考的软件定制,比如购......
  • 【快应用】如何实现快应用页面退出时弹框确认
    ​【现象描述】很多产品在设计时,希望按返回键退出的时候弹出一个对话框来确认是否退出,从而留住用户。快应用提供了这样的功能,和原生App一样,都是在页面的回调函数中处理的......
  • 四大组件之广播接收者BroadcastReceiver
    参考:Android开发基础之广播接收者BroadcastReceiver什么是广播接收者?我们小时候都知道,听广播,收听广播!什么是收听广播呢?打开收音机,调频就可以收到对应的广播节目了。其实......
  • Vue 父子组件双向绑定
    ####子组件<template><div><el-form:label-position="'left'"><el-row:gutter="gutter"><el-col:span="col">......