vue-router 源码之实现一个简单的 vue-router

2020-06-13 10:48:02易采站长站整理

前言

通过上篇,我们知道前端理由的两种实现方法,Hash 路由与 History 路由,并且用它们分别实现了一个前端路由。

接下来我们就将 Vue 与 Hash 路由结合,实现一个非常简单的 vue-router 吧。

开始实现

想象一下,如果自己实现了一个 vue-router,会怎么去使用呢?参考 vue-router 官方的使用方式,看看 html 的使用:


<div id="app">
<p>
<router-link to="#/">home</router-link>
<router-link to="#/book">book</router-link>
<router-link to="#/movie">movie</router-link>
</p>
<router-view></router-view>
</div>

这里会有 router-link 和 router-view 两个组件需要我们来实现。再来看 js 的:


const Home = { template: '<div>home</div>' };
const Book = { template: '<div>book</div>' };
const Movie = { template: '<div>movie</div>' };

const routes = [
{ path: '/', component: Home },
{ path: '/book', component: Book },
{ path: '/movie', component: Movie }
];

const router = new VueRouter(Vue, {
routes
});

new Vue({
el: '#app'
});

这里会有我们自己定义的组件 Home、Book 和 Movie,并且有它们各自对应的路由。我们实现的 VueRouter 跟官方的有些区别,在 VueRouter 被 new 时是将 Vue 作为参数传入,而不是注入挂载到根实例下。

接下来就是 VueRouter 的实现了。

VueRouter

要怎么来实现 VueRouter 呢,先提供一下实现的思路:

绑定 hashchange 事件,实现前端路由;
将传入的路由和组件做一个路由映射,切换哪个路由即可找到对应的组件显示;
需要 new 一个 Vue 实例还做响应式通信,当路由改变的时候,router-view 会响应更新;
注册 router-link 和 router-view 组件。

先创建一个 VueRouter:


class VueRouter {
constructor (Vue, options) {
this.$options = options;
}
}

绑定事件

给 VueRouter 添加一个绑定事件的方法,一旦路由发生改变,会触发

onHashChange 
方法。


constructor (Vue, options) {
this.init();
}

// 绑定事件
init () {
window.addEventListener('load', this.onHashChange.bind(this), false);
window.addEventListener('hashchange', this.onHashChange.bind(this), false);
}

路由映射表

将传入的 options 设置成一张路由映射表,以便于通过路由查找到对应的组件。