返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue router应用问题实战记录
  • 398
分享到

Vue router应用问题实战记录

2024-04-02 19:04:59 398人浏览 安东尼
摘要

目录前言问题记录路由守卫的应用动态路由实现权限控制hash模式的路由参数被干扰跳转同组件路由,不刷新?总结前言 本文记录Vue2的vue-router在使用过程中遇到的一些问题。 问

前言

本文记录Vue2的vue-router在使用过程中遇到的一些问题。

问题记录

路由守卫的应用

根据路由守卫绑定的位置不同,有下面三种路由守卫

全局守卫

beforeEach/beforeResolve/afterEach

路由独享守卫

beforeEnter

组件内的守卫

beforeRouteEnter/beforeRouteUpdate/beforeRouteLeave

其完整的导航解析过程,看官方文档的说明是这样的:

导航被触发。

在失活的组件里调用 beforeRouteLeave 守卫。

调用全局的 beforeEach 守卫。

在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。

在路由配置里调用 beforeEnter。

解析异步路由组件。

在被激活的组件里调用 beforeRouteEnter。

调用全局的 beforeResolve 守卫 (2.5+)。

导航被确认。

调用全局的 afterEach 钩子。

触发 DOM 更新。

用创建好的实例调用 beforeRouteEnter 守卫中传给 next 的回调函数。

下面是几个常用钩子的实际应用场景:

beforeRouteLeave:跳转页面前,提醒用户,是否保存信息,或者自动为用户保存草稿。

beforeEach:判断是否登录、是否有权限等等,做跳转登录、申请权限、处理权限菜单等操作。

beforeRouteUpdate:重新进入相同页面时,重新初始化、加载数据。

beforeRouteEnter:获取当前页面的前一个页面的信息,比如我们在登录页,登录后要重定向到前一个页面,就可以通过这个钩子获取。注意:这里, 不!能!获取组件实例 this,因为新组件还没有被创建。不过,可以传一个回调,给next来访问实例,在创建好实例后,会执行。

beforeRouteEnter (to, from, next) {
  next(vm => {
    // 通过 `vm` 访问组件实例
  })
}

其他几个路由守卫,我这边不常用,有补充的观众欢迎留下评论。

动态路由实现权限控制

应用场景:管理端根据不同权限,需要展示不同的菜单栏,同时希望没有权限的用户无法访问某些页面。

解决方案:我们在进入路由前,做一个拦截,先判断是否需要处理页面权限,再判断是否已经处理了权限,如果回答都是“是”,我们不需要做处理。否则,请求接口,获取到当前用户的权限菜单,再根据后台返回的信息,给router动态添加路由,再重新进入路由(避免拦截的访问是新添加的路由,出现访问不到的问题)。

具体看下面的伪代码:

router.beforeEach((to, from, next) => {
    if (needAuthority(to.name)) {  //不需要判断权限的页面,不处理
      next()
      return
    } 
    if (alreadyGetAuthorityMenu) {  //已经处理过权限菜单,不再处理
        next()
        return
    }
  
    handleAuthority().then(()=>{
        next({ ...to, replace: true })  //处理权限菜单接口成功,动态路由已经添加了,重新进入路由
      }).catch(() => {
        console.log('请求权限菜单接口错误')
        next()
    })
})

在handleAuthority中我们做了这些事情

  • 判断是否有权限,没有权限的用户,跳转到权限申请页面
  • 根据后台传过来的权限列表,用router.addRoutes(routes: Array)这个api,给router动态添加需要权限控制的页面对应的路由。
  • 给router动态添加一个兜底页面,可以是提示没权限的页面,或者简单一个404页面。

需要注意的是,动态添加路由后,需要next({ ...to, replace: true })重新进入路由,否则,如果拦截的页面路由,是你后面才添加的路由,那新的路由会访问不到。

hash模式的路由参数被干扰

应用场景:比如微信分享链接会加上,类似'?from=singlemessage&isappinstalled=0'这类的参数,当我们使用hash模式路由,同时使用params的方式传参数的时候,常常会被外界的参数干扰到,导致页面无法访问或者参数获取不到,使用动态路由参数是更好的选择。

const router = new VueRouter({
  routes: [
    // 动态路径参数 以冒号开头
    { path: '/user/:id', component: User }
  ]
})
const userId = '123'
// 两种跳转方式
router.push({ name: 'user', params: { userId }}) // -> /user/123
router.push({ path: `/user/${userId}` }) // -> /user/123
// 这里的 params 不生效
router.push({ path: '/user', params: { userId }}) // -> /user

更进一步,我们可以使用props,将组件和路由解耦,在组件中定义id这个props,就能拿到传递的参数。

const router = new VueRouter({
  routes: [
    { path: '/user/:id', component: User, props: true }
  ]
})

跳转同组件路由,不刷新?

应用场景:跳转同个组件的页面,但是参数不同,期望重新刷新页面。

解决方案:我们可以在beforeRouteUpdate中,重新执行进入页面要执行的代码,但如果需要初始化所有变量,难免有遗漏,更简单的方式是,监听route变化,有变化是 this.$router.Go(0)刷新。

// 推荐
beforeRouteUpdate(to, from, next) {
    // 重新加载数据
    next();
},
watch: {
 '$route'(to, from) {
    this.$router.go(0)
 }
}

总结

到此这篇关于Vue router应用问题的文章就介绍到这了,更多相关Vue router应用问题内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue router应用问题实战记录

本文链接: https://lsjlt.com/news/145840.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue router应用问题实战记录
    目录前言问题记录路由守卫的应用动态路由实现权限控制hash模式的路由参数被干扰跳转同组件路由,不刷新?总结前言 本文记录vue2的vue-router在使用过程中遇到的一些问题。 问...
    99+
    2024-04-02
  • npm踩坑问题实战记录
    目录一、npm安装依赖失败问题二、npmlockfile报错三、npmERR!codeEPERM问题四、npmERR!codeEEXIST(文件已存在,拒绝删除)补充:通过npm命令...
    99+
    2024-04-02
  • Vue router应用问题怎么解决
    这篇文章主要讲解了“Vue router应用问题怎么解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue router应用问题怎么解决”吧!问题记录路由守卫的应用根据...
    99+
    2023-06-30
  • shell脚本换行问题实战记录
    目录1-脚本代码太长需要换行2-echo输出给用户看的命令太长需要换行3-read -p提取用户输入的时候提示太长需要换行参考文档:总结在shell编程中遇到一些需要换行的情 1-脚本代码太长需要换行 这个情况是指我们某...
    99+
    2023-02-18
    shell脚本中换行 shell脚本换行命令 shell程序输出换行
  • 一次docker登录mysql报错问题的实战记录
    目录起因解决方法附:docker下进入mysql命令行总结起因 最近想再重温重温MySQL,于是就打开VMware登上了我的小破机。想着之前在docker上面已经装过MySQL了,就...
    99+
    2024-04-02
  • MySQL深分页问题解决的实战记录
    目录前言limit深分页为什么会变慢?通过子查询优化回顾B+ 树结构把条件转移到主键索引树INNER JOIN 延迟关联标签记录法使用between...and...手把手实战案例一...
    99+
    2024-04-02
  • vue3.0 setup中使用vue-router问题
    目录vue3.0 setup中使用vue-routervue-router4与vue3的setup使用在 setup 中访问路由和当前路由route 对象是一个响应式对象导航守卫vu...
    99+
    2022-11-13
    vue3.0 setup 使用vue-router vue3.0 setup vue-router
  • vue3使用vue-router的完整步骤记录
    前言 对于大多数单页应用程序而言,管理路由是一项必不可少的功能。随着新版本的Vue Router处于Alpha阶段,我们已经可以开始查看下一个版本的Vue中它是如何工作的。 Vue3...
    99+
    2024-04-02
  • vue+echarts图表使用的问题记录
    前言 echarts是我最常用的一直图表工具,而且也是一个很完整的生态和内容,足够我们平常的使用了。最近在做一个大数据平台的页面,需要用到比较多的图表,就使用了echarts。使用过...
    99+
    2024-04-02
  • vue使用echarts词云图的实战记录
    echarts词云图是echarts的一个扩展 https://echarts.apache.org/zh/download-extension.html 1.安装依赖 &nb...
    99+
    2024-04-02
  • vue跳转后不记录历史记录的问题
    目录vue跳转后不记录历史记录vue-router回退不记录历史场景说明处理方案其他api跳转vue跳转后不记录历史记录 vue路由跳转一般情况下是使用push,  this.$ro...
    99+
    2024-04-02
  • 解决vue路由组件vue-router实例被复用问题
    最近在开发过程中遇到如下问题: 当前路由是这样的 http://127.0.0.1:3010/orderkeywords=22 只改变keywords的值,路由不跳转 http://...
    99+
    2024-04-02
  • SpringBoot实战记录之数据访问
    目录前言SpringBoot整合MyBatis环境搭建注解方式整合mybatis使用xml配置Mybatis整合Redis接口整合测试总结前言 在开发中我们通常会对数据库的数据进行操...
    99+
    2024-04-02
  • Vue项目中如何运用vuex的实战记录
    目录Vuex是什么?vuex使用周期图我的store目录实现一个vuex的示例总结Vuex 是什么? TIP 👉 官网解释:Vuex 是一个专为 Vue.js 应用...
    99+
    2024-04-02
  • Vue中使用iframe踩坑问题记录iframe+postMessage
    目录使用iframe踩坑记录 iframe+postMessage1.iframe的初始高度问题2.postMessage的实现iframe使用postMessage传值addEve...
    99+
    2024-04-02
  • Vue实战记录之登陆页面的实现
    目录1 前期准备1.1 安装Node.js1.2 安装webpack1.3 安装vue-cli2 搭建Vue项目2.1 创建项目2.2 项目目录2.3 导入Element UI3 实...
    99+
    2024-04-02
  • vue路由组件vue-router实例被复用问题怎么解决
    本文小编为大家详细介绍“vue路由组件vue-router实例被复用问题怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue路由组件vue-router实例被复用问题怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-07-02
  • 一次线上websocket返回400问题排查的实战记录
    目录现象抓包排查问题定位解决方案1解决方案2原因探讨总结现象 生产环境websocket无法正常连接,服务端返回400 bad request,开发及测试环境均正常。 抓包排查 s...
    99+
    2024-04-02
  • SpringBoot+VUE实现前后端分离的实战记录
    一,前端VUE项目 这里使用VUE UI创建一个VUE项目 命令行输入vue ui进入 手动配置项目 选中这三个 点击下一步->点击创建项目 用IDEA打开刚才创建的项目...
    99+
    2024-04-02
  • JavaScript中防抖和节流的实战应用记录
    目录前言为什么我们需要防抖/节流防抖节流总结前言 你可能会遇到这种的情况,一个站点使用自动填充的文本框,内容的拖拽,效果的滚动。那么,你遇到防抖和截流的概率还是很高的。为了使得这些操...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作