手写vueRouter

/*
    需求分析:
    1、vueRouter类和install方法
    2、全局组件 router-view (显示内容)和 router-link(用于跳转)
    3、监控url的变化,  hashchange或popstate
    4、响应最新url:创建一个响应current,,当它改变获取对应组件并显示
*/

第一步:vueRouter类和install方法

// 1.实现一个Router类并挂载期实例
let Vue;

class VueRouter {
  constructor(options) {
    this.$options = options;
    if(options.mode){
        console.log(options.mode)
    }
  }
}

// 插件需要实现install方法
VueRouter.install = function (_Vue) {
  // 保存Vue构造函数在VueRouter中使用
  Vue = _Vue;
   // 任务1:使用混入来做router挂载这件事情
  Vue.mixin({
    beforeCreate() {
      // 只有根实例才有router选项
      if (this.$options.router) {
        Vue.prototype.$router = this.$options.router
      }
  })
}

第二步:组件

Vue.component('router-link',    
props: {
      to: {
        type: String,
        required: true
      },
    },
    render(h) {
      // h(tag, props, children)
      return h('a',
        { attrs: { href: '#' + this.to } },
        this.$slots.default
      )
    }) 
    
    Vue.component('router-view',  {
    render(h) {
    }
  }))

第三步 :定义响应式的current属性,监控url的变化,hashchange或popstate,

  
  construct(){
  /*

  Vue.util.defineReactive, 这是Vue里面观察者劫持数据的方法,
  劫持_route,当_route触发setter方法的时候,则会通知到依赖的组件。

  */

 Vue.util.defineReactive(this, 'current', '' )
  // 请确保onHashChange中this指向当前实例
    window.addEventListener('hashchange', this.onHashChange.bind(this))
  }
 onHashChange() {
    console.log(window.location.hash);
    this.current = window.location.hash.slice(1) || '/'
   }
  }

第四步:提前处理路由表

// 缓存path和route映射关系
this.routeMap = {} 
this.$options.routes.forEach(route => {
      this.routeMap[route.path] = route
   });

第五步:更新组件

vueRouter

render(h) {
      // 根据current获取组件并render
      // current怎么获取?
      // console.log('render',this.$router.current);
      // 获取要渲染的组件
      let component = null
      const { routeMap, current } = this.$router
      if (routeMap[current]) {
        component = routeMap[current].component
      }
      return h(component)
  }

参考链接

vue.install 什么时候被调用?

vue mixin 概念

Vue 隐藏工具 Vue.util

vue Router

vue API 参考

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值