首页 > 其他分享 >解决vue-router@3重复添加路由导致的控制台警告

解决vue-router@3重复添加路由导致的控制台警告

时间:2022-11-01 17:33:33浏览次数:113  
标签:vue addRoutes VueRouter 规则 routes router 控制台 路由

vue 项目的权限限制功能, 有一种实现方案是这样的

  • 进入项目
  • 只设置没有权限要求的路由
  • 向后台提供当前用户的权限
  • 后台根据用户权限, 返回该用户可以用的路由信息
  • 将路由信息翻译成 “符合 routes 选项要求的数组”
  • 用 router.addRoutes(routes) 方法把 “符合 routes 选项要求的数组” 添加到路由

这个方案涉及到两个问题:

  1. 怎么添加路由规则
  2. 怎么删除路由规则

路由规则

首先明确一下什么叫路由规则?
下例的 { path: ‘/foo’, component: Foo } 就是一条路由规则

var router = new VueRouter({
	routes: [{
		path: '/foo',
		component: Foo
	}, {
		path: '/bar',
		component: Bar
	}]
})

将路由规则包装成数组, 这个数组就是下面要提供给 router.addRoutes 方法的数据

添加路由规则

官方有提供添加规则的方法 router.addRoutes()

router.addRoutes(routes: Array)
动态添加更多的路由规则。参数必须是一个符合 routes 选项要求的数组。

var router = new VueRouter({
	routes: [{
		path: '/foo',
		component: Foo
	}]
});

router.addRoutes([{
	path: '/bar',
	component: Bar
}])

这样就已经把 bar 添加到路由当中, 可以说是简单粗暴且高效

添加路由规则时, 要注意一个细节
addRoutes 只能把新路由规则添加到末尾
如你的路由规则很复杂, 一个路径可以匹配好几个路由的话, 那你要仔细设计你的路由了
因为路由规则的顺序是有意义的, 越靠前优先级越高, 这将直接影响匹配结果

删除路由规则

神奇的是官方只提供了增加规则的方法, 却不提供删除规则的方法
经过学习, 我找到了一个效果相近的方法

var router = new VueRouter({
	routes: [{
		path: '/foo',
		component: Foo
	}]
});

router.addRoutes([{
	path: '/bar',
	component: Bar
}])

// 获取原始路由数据
var options = router.options

// 用原始数据重新 new 一个路由
var _VueRouter = new VueRouter(options)

// 用新路由的 matcher 替换旧路由的 matcher
router.matcher = _VueRouter.matcher

这样就相当于把路由重置了
获得原始数据后, 也可以根据项目要求, 向 options 插入路由规则, 再重新 new 一个路由

删除方法原理简析

看过 vue router 源码的朋友大概都知道

new VueRouter() 后, routes 数据会被传给内部方法 createMatcher()

createMatcher 方法中有三个对象 pathList, pathMap, nameMap 和两个方法 addRoutes, match

三个对象用于保存编译后的路由数据, 因为没有暴露出去, 所以 router 并不能查询到编译后的路由数据( router.options 其实是初始化时的数据, 上面的例子也有用到它)

两个方法被 createMatcher return, 最终保存在 this.matcher 上面, 可以被 router.matcher 调用

上面的方法本质就是用新数据 new 一个新路由对象 _VueRouter
从而得到新的 pathList, pathMap, nameMap

因为 pathList, pathMap, nameMap 是内部变量, 不能直接调用
只能被内部方法如 addRoutes, match 调用
所以用替换 matcher 的方式, 替换了整个 createMatcher (这里是闭包的知识)

简单点说就是
新的 matcher 包含新的 addRoutes, match
新的 addRoutes, match 可以调用新的 pathList, pathMap, nameMap

关于 vue [email protected] 的 removeRoute

随着 vue3.x 的发展, vue router 也推出了 4.x(不知道为什么中文官网好像没提到这个)
而 4.x 中新增了 removeRoute 方法, 就是用户删除路由规则的

如果你已经在使用 vue [email protected]
那么上面的话当我没说

end

文章知识点与官方知识档案匹配,可进一步学习相关知识

Vue入门技能树Vue-routervue-router是什么?17994 人正在系统学习中

标签:vue,addRoutes,VueRouter,规则,routes,router,控制台,路由
From: https://www.cnblogs.com/whh666/p/16848522.html

相关文章

  • vue3 toRef toRefs toRaw使用
    //只能修改响应式对象的值constperson=reactive({name:"zhangsan",age:18});//将age属性单独提出来响应式数据constageCopy=toRef(person,"age");cons......
  • 一个实用的 vite + vue3 组件库脚手架工具,提升开发效率
    无论是vue2全家桶还是vue3+vite+TypeScript,组件库的使用几乎大家都会,但自己开发一个独立组件库就不是每个人都掌握的,因为搭建组件库的基础开发环境,就会让很多同学望......
  • vue-handsontable常用配置项
    hotSettings:{data:this.objectData,//data:HandsontablePro.helper.createSpreadsheetData(100,50),//data:this.getDate(),......
  • 使用vue-handsontable实现web execl编辑
    npminstall--savevue-handsontable-official<template><divclass="wrap"><HotTable:root="test":settings="hotSettings"></HotTable></div></template><scri......
  • DJango + Vue 跨域问题解决
    什么是跨域同源:协议+域名+端口号,三者完全相同以上三个元素只要有一个不相同就是跨域产生跨域异常的报错信息如下:accesstoxmlhttprequestat'http://ip:port1/a......
  • 为什么vue3要选用proxy,好处是什么?
    提问Object.defineProperty()和proxy的区别?为什么vue3要选用proxy,好处是什么?proxyProxy对象用于创建一个对象的代理,从而实现基本操作的拦截和自定义(如属性查找、赋......
  • vue项目.editorconfig,.eslintgnore,.eslintrc配置编写规则文件
    1:介绍  ESLint是一个QA工具,用来避免低级错误和统一代码的风格,ESLint的主要用途:审查代码是否符合编码规范和统一的代码风格;审查代码是否存在语法错误;ESLint中文网地址......
  • Vue项目配置postcss-pxtorem
    Vue2项目安装指定版本最新版本@6会报错:PostCSSpluginpostcss-pxtoremrequiresPostCSS8npmipostcss-pxtorem@5.1.1-D配置vue.config.jsmodule.exports=......
  • unplugin-vue-components 在 vite 中的使用和配置
    unplugin-vue-components是由vue官方人员开发的一款自动引入插件,可以省去比如UI库的大量import语句。安装:npmiunplugin-vue-components-D配置:vite.confi......
  • vue3-组合式api-定义响应式数据-reactive,toRefs
    <template> <div>  {{obj.name}}  {{name}}  <button@click="changeObjName">改变名字</button> </div></template><script>import{react......