80437700 2020-06-02
一、vue-router
vue-router是vue.js的官方路由管理器。可以方便构建单页应用。
二、vue-router使用
1.安装 vue add router
2.router.js
* 使用vue-router插件
import VueRouter from‘vue-router‘ Vue.use(VueRouter)
* 创建VueRouter实例
const router = new VueRouter({
// ...
})
export default router3.main.js(添加VueRouter实例)
import router from‘./router‘
new Vue({
router,
// ...
}).$mount("#app");4.vue文件添加路由视图
<router-view></router-view>
三、实现思路
1.作为插件需要实现install方法
2.实现router-view用于展示组件内容,router-link用于跳转
3.监听hashchange或popstate事件
4.需要一个响应式属性current,改变时获取对应组件展示
四、源码实现
1.Vue.js要求插件有一个公开方法 install。这个方法的第一个参数是Vue构造器,第二个参数是一个可选的选择对象。
*install方法中可做处理
let Vue;
class VueRouter {
constructor(options) {
this.$options = options
}
}
// 执行install方法时,会把Vue传进来
VueRouter.install = function(_Vue, options) {
// 保存构造函数在tvue-router中使用
// this是指VueRouter构造器
Vue = _Vue
// 挂载$router(通过mixin混入生命周期处理)
Vue.mixin({
beforeCreate() {
// this指Vue构造器
// 确保根实例的时候才执行
if (this.$options.router) {
Vue.prototype.$router = this.$options.router
}
}
})
}
export default VueRouter2.实现router-link和router-view
*实现router-link
// install方法中声明组件
Vue.component(‘router-link‘, {
props: {
to: {
type: String,
required: true
}
},
render(h) {
// 运行时环境只能使用render函数
return h(‘a‘, {attrs: {href: ‘#‘ + this.to}}, this.$slots.default)
}
})*VueRouter监控url变化对应展示不同组件
class VueRouter {
constructor(options) {
this.$options = options
// 缓存路由信息
this.routeMap = {}
this.$options.routes.forEach(route=>{this.routeMap[route.path] = route})
Vue.util.defineReactive(this, ‘current‘, ‘/‘)
// 监听url变化
window.addEventListener(‘hashchange‘, this.onHashChange.bind(this))
window.addEventListener(‘load‘, this.onHashChange.bind(this))
}
onHashChange() {
this.current = window.location.hash.slice(1)
}
}
// install方法混入
Vue.component(‘router-view‘, {
render(h) {
const {routeMap,current} = this.$router
const component = routeMap[current].component
return h(component)
}
})