vue中的vueRouter源码分析


class historyRoute{
  construcor() {
    this.current = null;
  }
}
class vueRouter {
  constructor(options) {
    this.mode = options.mode || 'hash'; //模式
    this.routes = options.routes || []; //路由
    this.history = new historyRouter; //current值
    this.routesMap = this.createMap(this.routes) //转换成key-vaule
    this.init();
  }
  init() {
    if(this.mode =='hash') {
      location.hash ? '' : location.hash = '/';
      window.addEventListener('load',()=>{
        this.history.current = location.hash.slice(1)
      })
      window.addEventListener('hashchange',()=>{
        this.history.current = location.hash.slice(1)
      })
    }else {
      location.pathname ? '' : location.pathname = '/';
      window.addEventListener('load',()=>{
        this.history.current = location.pathname
      })
      window.addEventListener('popstate',()=>{
        this.history.current = location.pathname
      })
    }
  }
  createMap(routes) {
    return routes.reduce((pre,current)=>{
      pre[current.path] = current.component;
      return pre 
    })
  }
}
//Vue监视current变量
vueRouter.install = function(Vue) {
  Vue.mixin({
    beforeCreate() {
      if(this.$options && this.$options.router) {
        this._root = this; //就是把_root绑定到Vue实例
        this._router = this.$options.router;
        Vue.util.defineReactive(this, 'current', this._router.history)
      }else {
        this._root = this.$parent._root
      }
    }
  })
  //获取新组建以及render
  Vue.component('router-view',{
    //渲染新组件
    render(h) {
      let current = this._self._root._router.history.current;
      let routesMap = this._self._root._router.routesMap;
      return h(routesMap[current])
    }
  })
}
export default vueRouter
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值