基础用法
先了解下router的用法
Vue项目,router文件夹下的index.js文件
我们忽略其他内容,只关注如下代码
1 | import Vue from 'vue';//导入Vue |
根目录下的main.js文件
1 | import Vue from 'vue' |
然后我们就可以在项目的任何地方使用
1 | <template> |
分析路由功能
首先:router/index.js中如下代码
1 | Vue.use(VueRouter); |
从Vue.js官网可以得知:使用Vue.use的用法是安装Vue.js插件。如果插件是一个对象,必须提供 install 方法。如果插件是一个函数,它会被作为 install 方法。install 方法调用时,会将 Vue 作为参数传入。
所以我们可以得出以下结论
VueRouter
是一个插件:因为使用了Vue.use
内部做了什么??
- 实现并声明了组件
router-view
router-link
全局注册了 - 是一个插件,所以会有install方法
this.$router.push()
方法
然后:main.js中把router/index.js中导出的VueRouter实例添加的Vue构造函数上
1 | new Vue({ |
这样,我们后面就可以使用Vue提供的$options方法获取到该router
最后,在页面上使用router-link和router-view组件
1 | <router-link to="/">Home</router-link> |
- 没有声明就可以直接使用,说明全局注册了
- 为什么点击router-link,router-view内容发生改变,–》利用Vue响应式
实现简易Router
因为VueRouter是一个插件,必须含有install方法
install方法接受一个入参,该入参为Vue构造函数
1、首先创建VueRouter类,并添加install方法
1 | let Vue;//该变量用于保存Vue构造函数,插件中使用,不导入还能用 |
2、然后我们应该挂载一个$router属性
这样就可以在全局范围内使用this.$router来访问路由了
这里我们使用全局混入-》为什么?
在
router/index.js
中,Vue.use(VueRouter)
很早就定义了,而我们的配置项routes则是在后面定义的,所以此时我们拿不到routes配置项
这里需要用到全局混入–》目的:延迟下面逻辑到router创建完毕并且附加到选项上才执行
1 | VueRouter.install = function (_Vue) { |
3、接着注册并实现router-link组件
注意:在使用
router-link
时会传入一个属性to,所以我们可以使用props来获取router-link
标签内部动态内容可以使用插槽来获取,this.$slots.default
1 | VueRouter.install = function (_Vue) { |
我们还需要处理的是router-view组件,但是我们先在VueRouter构造器中初始化一些变量
因为我们使用router-view时会匹配到路径对应的组件
1 | //实例化时传入一个对象 |
现在我们已经定义了一个current的响应式数据,并且监听了路由的变化,所以,我们现在来编写router-view组件来渲染对象的内容
注册并实现router-view
1 | VueRouter.install = function (_Vue) { |