如何实现一个最简单的Vue-Router
要自己实现一个mini版的Vue-Router,当然要先了解他(Vue-Router)的原理。以及他都做了些什么?
Vue-Router的实现原理
先来看看Vue-Router官网对自己的介绍:
Vue-Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。
那么本文中的mini版Vue-Router会简单实现一些Vue-Router的基础功能:
- 像真正的Vue-Router一样编写路由(仅基础实现)
- 实现Vue-Router的hash模式url
- 声明两个全局组件:router-link,router-view
- 响应式切换路由视图
1. 提前扫盲,每次我们要引入Vue-Router都要使用以下代码来安装
1 | import Vue from 'vue' |
官方文档的解释:
安装 Vue.js 插件。如果插件是一个对象,必须提供 install 方法。如果插件是一个函数,它会被作为 install 方法。install 方法调用时,会将 Vue 作为参数传入。
Vue.use()
会执行传入对象的install方法,以此安装插件
所以,想要我们的Vue-Router能够像官方的写法一致,除了提供类似的构造函数,还需要提供install方法。
2. 编写VueRouter类,以及他的构造函数
新建一个my-vue-router.js
1 | let Vue; // 通过插件传递进来的Vue对象 |
3. 编写VueRouter的install静态方法
使用Vue.mixin()
将router对象绑定到Vue的原型链上
关于混入
1 | //提供install方法 |
4. 梳理VueRouter类的结构与逻辑
1 | export default class VueRouter { |
5. bindEvents方法
监听hashchange事件,每当跟在#符号后面的URL部分(包括#符号)改变,就会触发该事件。
关于hashchange
1 | bindEvents(){ |
6. createRouteMap方法
解析option中的router
1 | // 解析routes选项 |
7. initComponent方法(声明组件)
使用Vue.component()
方法声明全局组件
使用render()
函数渲染router-link组件的dom
1 | // 声明两个组件 |
8. 像真正的Vue-Router一样使用
在router.js中
1 | import Vue from 'vue' |
App.vue中
1 | <template> |
在main.js中引入
1 | import Vue from 'vue' |
OK! 现在你应该可以在项目中看到效果了
小结
因为这是一个mini版本,非常简陋,仅仅实现了最基础的几个功能。