手写router(简单实现嵌套路由)
需求分析: 简单实现嵌套路由
- ① 记录当前路由的深度depth
- ② 路由匹配,得到深度对应的组件
代码实现
let Vue;
class Router {
constructor(options) {
this.$options = options;
this.routeMap = {};
this.current = window.location.hash.slice(1) || "/";
window.addEventListener("hashchange", this.onHashchange.bind(this));
window.addEventListener("load", this.onHashchange.bind(this));
Vue.util.defineReactive(this, "matched", []);
this.match();
}
onHashchange() {
this.current = window.location.hash.slice(1);
this.matched = [];
this.match();
}
match(routes) {
routes = routes || this.$options.routes;
for (const route of routes) {
if (route.path === "/" && this.current === "/") {
this.matched.push(route);
return;
}
if (route.path !== "/" && this.current.includes(route.path)) {
this.matched.push(route);
if (route.children) {
this.match(route.children);
}
return;
}
}
console.log(this.matched)
}
static install(_Vue) {
Vue = _Vue;
Vue.mixin({
beforeCreate() {
if (this.$options.router) {
Vue.prototype.$router = this.$options.router;
}
},
});
Vue.component("router-link", {
props: {
to: {
type: String,
default: "",
},
},
render(h) {
return h("a", { attrs: { href: "#" + this.to } }, this.$slots.default);
},
});
Vue.component("router-view", {
render(h) {
this.$vnode.data.routerView = true;
let depth = 0;
let parent = this.$parent;
while (parent) {
const vnodeData = parent.$vnode && parent.$vnode.data;
if (vnodeData && vnodeData.routerView) {
depth++;
}
parent = parent.$parent;
}
const route = this.$router.matched[depth]
const comp = route && route.component || null
return h(comp);
},
});
}
}
export default Router;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了