vue-router 源码之实现一个简单的 vue-router
前言通过上篇,我们知道前端理由的两种实现方法,Hash 路由与 History 路由,并且用它们分别实现了一个前端路由。 接下来我们就将 Vue 与 Hash 路由结合,实现一个非常简单的 vue-router 吧。 开始实现想象一下,如果自己实现了一个 vue-router,会怎么去使用呢?参考 vue-router 官方的使用方式,看看 html 的使用: 这里会有 router-link 和 router-view 两个组件需要我们来实现。再来看 js 的: home ' };
const Book = { template: 'book ' };
const Movie = { template: 'movie ' };
const routes = [ const router = new VueRouter(Vue,{ new Vue({ 这里会有我们自己定义的组件 Home、Book 和 Movie,并且有它们各自对应的路由。我们实现的 VueRouter 跟官方的有些区别,在 VueRouter 被 new 时是将 Vue 作为参数传入,而不是注入挂载到根实例下。 接下来就是 VueRouter 的实现了。 VueRouter要怎么来实现 VueRouter 呢,先提供一下实现的思路:
先创建一个 VueRouter: 绑定事件给 VueRouter 添加一个绑定事件的方法,一旦路由发生改变,会触发 // 绑定事件
init () { window.addEventListener('load',this.onHashChange.bind(this),false); window.addEventListener('hashchange',false); } 路由映射表将传入的 options 设置成一张路由映射表,以便于通过路由查找到对应的组件。 // 路由映射表
createRouteMap (options) { options.routes.forEach(item => { this.routeMap[item.path] = item.component; }); } options 之中,路由与组件的关系: 生成的路由映射表: 响应我们需要 new 一个新的 Vue 实例,将当前路由 current 储存在其 data 之中,当修改了 current 时,router-view 就会自己去更新视图。 // 获取当前 hash 串
getHash () { return window.location.hash.slice(1) || '/'; } // 设置当前路径 只要在 注册组件
// 注册组件
initComponent (Vue) { Vue.component('router-link',{ props: { to: String },template: ' }); const _this = this; 完整代码至此,一个简单的 vue-router 就出来了,全部代码是这样的: this.init();
this.createRouteMap(this.$options); this.initComponent(Vue); } // 绑定事件 // 路由映射表 // 注册组件 const _this = this; // 获取当前 hash 串 // 设置当前路径 最后将 Vue 与 Hash 路由结合,监听了 hashchange 事件,再通过 Vue 的 响应机制 和 组件,便有了上面实现好了一个 vue-router。 全部源码参考这里。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |