路由缓存问题 | vue-router的导航守卫

这篇具有很好参考价值的文章主要介绍了路由缓存问题 | vue-router的导航守卫。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

路由缓存问题

        带参路由,当参数发生变化时,相同的组件实例将被复用,组件的生命周期钩子不会被调用,导致请求不会被重新发送,以至于数据无法更新

两种解决方法:

1. 给 RouterView绑定key值,即
<RouterView :key="$route.fullPath" />

特点:不复用,破坏组件缓存,强制执行,存在一定的浪费,即 会重复请求数据。如,

路由缓存问题 | vue-router的导航守卫,vue项目,项目中认识vue,vue学习,缓存,前端

2.  使用 onBeforeRouteUpdate 导航钩子(导航守卫)会在每次路由更新之前执行,在回调中执行数据更新的业务逻辑即可。
// 1. 导入钩子
import { onBeforeRouteUpdate } from 'vue-router'

// 2. 使用钩子,路由参数变化时,把数据接口重新发送
//     to 目标路由 
onBeforeRouteUpdate((to)=>{
    // 更新接口业务逻辑
})

特点:精细化控制,性能较好。例子, 

路由缓存问题 | vue-router的导航守卫,vue项目,项目中认识vue,vue学习,缓存,前端


导航解析流程

  1. 导航被触发。
  2. 在失活的组件里调用 离开守卫 beforeRouteLeave
  3. 调用全局的 beforeEach 前置守卫
  4. 重用的组件里调用 beforeRouteUpdate 路由更新守卫 (2.2+)。
  5. 路由配置里调用 beforeEnter
  6. 解析异步路由组件。
  7. 在被激活的组件里调用 beforeRouteEnter 确认守卫
  8. 调用全局的 beforeResolve 解析守卫 (2.5+)。
  9. 导航被确认。
  10. 调用全局的 afterEach 后置钩子
  11. 触发 DOM 更新。
  12. 用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。

路由缓存问题 | vue-router的导航守卫,vue项目,项目中认识vue,vue学习,缓存,前端

导航守卫

vue-router 提供的,用于通过 跳转/取消 守卫导航。

参数/查询的改变 并不会触发进入/离开的导航守卫。可以通过观察 $route对象 来应对变化,或使用 BeforeRouteUpdate 的组件内守卫。

参数:

- to 目标路由

- from 离开的路由

- next 函数,用于调用来resolve这个钩子

路由缓存问题 | vue-router的导航守卫,vue项目,项目中认识vue,vue学习,缓存,前端

路由导航种类:

- 全局前置守卫 router.beforeEach

导航 触发时,守卫 按照创建顺序调用。守卫是异步解析执行,此时 导航在所有守卫resolve完之前按一直是处于等待中。--》执行顺序:守卫->导航

const router = new VueRouter({ ... })

router.beforeEach((to, from, next) => {
  // ...
})
- 全局解析守卫 router.beforeResolve(2.5.0新增)

导航被确认之前,同时在所有组件内 守卫和 异步路由组件被解析之后,解析守卫就被调用

 - 全局后置钩子 route.afterEach

不接受 next函数,且不改变导航本身。

router.afterEach((to, from) => {
  // ...
})
- 单个路由独享 beforeEnter

在路由配置中 定义 beforeEnter 守卫。

const router = new VueRouter({
  routes: [
    {
      path: '/foo',
      component: Foo,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]
})
- 组件级 beforeRouteEnter、beforeRouteUpdate(2.2新增)、beforeRouteLeave

组件内 定义路由导航守卫。

  • 确认守卫 beforeRouteEnter,守卫在导航确认前被调用,新组件尚未创建,即无法访问 this,只有它支持给next传递回调。
  • 更新守卫beforeRouteUpdate,守卫在当前路由改变,但组件被复用时,用于更新(新路由重调接口)
  • 离开守卫 beforeRouteLeave,用于禁止在还未保存修改前突然离开。可通过 next(false) 来取消。
beforeRouteLeave (to, from , next) {
  const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
  if (answer) {
    next()
  } else {
    next(false)
  }
}
const Foo = {
  template: `...`,
  beforeRouteEnter (to, from, next) {
    next(vm => {})
    // 在渲染该组件的对应路由被 confirm 前调用
    // 不!能!获取组件实例 `this`
    // 因为当守卫执行前,组件实例还没被创建
  },
  beforeRouteUpdate (to, from, next) {
    // 在当前路由改变,但是该组件被复用时调用
    // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
    // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
    // 可以访问组件实例 `this`
  },
  beforeRouteLeave (to, from, next) {
    // 导航离开该组件的对应路由时调用
    // 可以访问组件实例 `this`
  }
}

参考:导航守卫 | Vue Router文章来源地址https://www.toymoban.com/news/detail-703781.html

到了这里,关于路由缓存问题 | vue-router的导航守卫的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 基于vscode开发vue3项目的详细步骤教程 3 前端路由vue-router

    基于vscode开发vue3项目的详细步骤教程 3 前端路由vue-router

    1、Vue下载安装步骤的详细教程(亲测有效) 1_水w的博客-CSDN博客 2、Vue下载安装步骤的详细教程(亲测有效) 2 安装与创建默认项目_水w的博客-CSDN博客 3、基于vscode开发vue项目的详细步骤教程_水w的博客-CSDN博客 4、基于vscode开发vue项目的详细步骤教程 2 第三方图标库FontAwesome_水w的

    2024年02月02日
    浏览(33)
  • 基于vscode实现vue3项目创建启动+安装配置路由vue-router实现单页面组件切换

    基于vscode实现vue3项目创建启动+安装配置路由vue-router实现单页面组件切换

    访问https://nodejs.org/en,点击下载最新版本的nodejs,并安装。 在项目目录文件下,通过cmd运行下述指令。 依次输入下列命令,启动vue项目 在浏览器中加载http://localhost:5173/,页面加载成功,说明vue项目安装启动成功。 建议安装第三方库通过vscode中的终端来操作,项目启动通过

    2024年02月03日
    浏览(46)
  • vue2创建项目的两种方式,配置路由vue-router,引入element-ui

    vue2创建项目的两种方式,配置路由vue-router,引入element-ui

    提示:vue2依赖node版本8.0以上 使用@vue/cli脚手架vue create创建 使用vue-cli脚手架vue init webpack创建 1、查看nodejs版本 2、全局安装vue脚手架和webpack脚手架 3、新建vue2项目 创建选项除了,Install vue-router??选择是,其他选择的否 4、安装依赖并启动文件 5、预览 6、目录结构 1、如果安

    2024年04月14日
    浏览(15)
  • 完整的 vue-router 导航解析流程

    完整的 vue-router 导航解析流程

    在Vue.js中,vue-router是一个官方提供的路由管理器,它能够帮助我们实现页面之间的无缝切换和导航。 本文将深入探讨vue-router的导航解析流程,并通过示例代码演示如何使用vue-router实现完整的导航过程。 首先,让我们来了解一下vue-router的基本概念。在vue-router中,我们可以通

    2024年02月19日
    浏览(12)
  • Vue——路由守卫(全局前置路由守卫beforeEach、全局后置路由守卫router.afterEach、独享路由守卫beforeEnter、组件内路由守卫 )

    Vue——路由守卫(全局前置路由守卫beforeEach、全局后置路由守卫router.afterEach、独享路由守卫beforeEnter、组件内路由守卫 )

     作用:对路由进行权限控制 分类:全局守卫、独享守卫、组件内守卫 目录 一、全局前置路由守卫router.beforeEach(切换之前调用,to、from、next参数) 改进代码 二、全局后置路由守卫router.afterEach( 切换之后调用,to、from参数,没有next参数) 三、独享路由守卫beforeEnter(某一

    2024年02月08日
    浏览(9)
  • vue3 一个基于pinia简单易懂的系统权限管理实现方案,vue-router动态路由异步问题解决

    vue3 一个基于pinia简单易懂的系统权限管理实现方案,vue-router动态路由异步问题解决

    作为项目经验稀少的vue开发者来说,在关键技术点上的经验不多,我希望通过我的思想和实践,把好的东西分享在这里,目的是进一步促进技术交流。项目即将完成,权限是最后的收尾工作,好的权限实现方案,可以让我们没有后顾之忧,也可以提升项目的运行速度。 在开发

    2023年04月08日
    浏览(43)
  • Vue Router activated deactivated 路由守卫

    Vue Router activated deactivated 路由守卫

    activated 和 deactivated 是路由组件所独有的两个钩子,用于捕获路由组件的激活状态具体使用 activated 路由组件被激活时触发 deactivated 路由组件失活时触发 src/pages/News.vue 作用:对路由进行权限控制 分类:全局守卫、独享守卫、组件内守卫 全局守卫 全局守卫 meta路由源信息 独享

    2024年02月11日
    浏览(14)
  • 路由vue-router

    路由vue-router

    路由(英文:router)就是 对应关系 SPA 指的是一个 web 网站只有 唯一的一个 HTML 页面 ,所有组件的展示与切换都在这唯一的一个页面内完成。 此时,不同组件之间的切换需要通过前端路由来实现。 结论: 在 SPA 项目中,不同功能之间的切换 ,要依赖于 前端路由 来完成!

    2024年02月07日
    浏览(12)
  • 【Vue-Router】路由入门

    【Vue-Router】路由入门

    路由(Routing)是指确定网站或应用程序中特定页面的方式。在Web开发中,路由用于根据URL的不同部分来确定应用程序中应该显示哪个内容。 构建前端项目 安装依赖和路由 3. router 使用 login.vue reg.vue index.ts App.vue main.ts router-view 补充: router-view 是Vue Router提供的一个组件,用于

    2024年02月13日
    浏览(16)
  • vue、vuex、vue-router初学导航配合elementui及vscode快捷键

    目录 一、vue资源 1.vue知识库汇总 2.vuejs组件 3.Vue.js 组件编码规范 目标 #目录 #基于模块开发 #怎么做? #Vue组件命名 #为什么? #如何做? #组件表达式简单化 #为什么? #怎么做? #组件props原子化 #为什么? #怎么做? #验证组件的props #为什么? #怎么做? #将this赋值给component变

    2024年02月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包