Vue路由实现:macther中的addRoutes原理
Posted mengyuhang4879
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vue路由实现:macther中的addRoutes原理相关的知识,希望对你有一定的参考价值。
macther是什么?
根据用户传递的routes创建匹配关系,它里面提供两个方法:addRoutes和match
class VueRouter{
constructor(options){
//createMatcher返回addRoutes和match两个方法
this.matcher = createMatcher(options.routes || []);
}
init(app){}
}
编写createMatcher方法
function createMatcher(routes) {
// 收集所有的路由路径, 收集路径的对应渲染关系
// pathList = [\'/\',\'/about\',\'/about/a\',\'/about/b\']
// pathMap = {\'/\':\'/的记录\',\'/about\':\'/about记录\'...}
let {pathList,pathMap} = createRouteMap(routes);
// 这个方法就是动态加载路由的方法
function addRoutes(routes){
// 将新增的路由追加到pathList和pathMap中
createRouteMap(routes,pathList,pathMap);
}
function match(){} // 稍后根据路径找到对应的记录
return {
addRoutes,
match
}
}
addRoutes方法的实现
addRoutes是初始化路由表和新增路由。
function createRouteMap(routes,oldPathList,oldPathMap){
// 当第一次加载的时候没有 pathList 和 pathMap
let pathList = oldPathList || [];
let pathMap = oldPathMap || Object.create(null);
routes.forEach(route=>{
// 添加到路由记录,用户配置可能是无限层级,稍后要递归调用此方法
addRouteRecord(route,pathList,pathMap);
});
return { // 导出映射关系
pathList,
pathMap
}
}
// 将当前路由存储到pathList和pathMap中
function addRouteRecord(route,pathList,pathMap,parent){
// 如果是子路由记录 需要增加前缀
let path = parent?`${parent.path}/${route.path}`:route.path;
let record = { // 提取需要的信息
path,
component:route.component,
parent
}
if(!pathMap[path]){
pathList.push(path);
pathMap[path] = record;
}
if(route.children){ // 递归添加子路由
route.children.forEach(r=>{
// 这里需要标记父亲是谁
addRouteRecord(r,pathList,pathMap,route);
})
}
}
以上是关于Vue路由实现:macther中的addRoutes原理的主要内容,如果未能解决你的问题,请参考以下文章
vue动态添加路由addRoutes之不能将动态路由存入缓存
vue动态路由添加,vue-router的addRoute方法实现权限控制