手写VueRouter

Posted michael_yqs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写VueRouter相关的知识,希望对你有一定的参考价值。

手写VueRouter

定义VueRouter类

export default class VueRouter 
//构造函数中把参数存储下来
constructor(options) 
    this.options = options
    this.routeMap = //用于存储路由对应的view组件
    const cur =
      (this.options.mode === 'history'
        ? location.pathname
        : location.href.split('#')[1]) || '/'/*当前路由
若是history模式,则直接取pathname,否则解析出#后面的内容作为路由*/
    this.data = _Vue.observable(
      current: cur,
    )

实现静态方法install

在里面需要判断插件是否安装,安装了则什么也不做,否则注入实例

static install(vue) 
    //判断当前插件是否已安装
    if (VueRouter.install.isinstalled) 
      return
    
    VueRouter.install.isinstalled = true
    //把vue构造函数记录到全局变量
    _Vue = vue
    //把创建vue实例时传入的router对象注入到vue实例上
    _Vue.mixin(
      beforeCreate() 
        if (this.$options.router) 
          _Vue.prototype.$router = this.$options.router
          this.$options.router.init()
        
      ,
    )
  
  init() 
    this.createRouteMap()//建立路由和view的映射关系
    this.initComponents(_Vue)//component渲染
    this.initEvent()//浏览器事件处理
  

存储路由对应的组件

//解析路由规则为键值对形式,存储到实例的routemap 中
  createRouteMap() 
    this.options.routes.forEach((route) => 
      this.routeMap[route.path] = route.component
    )
  

处理router-link,router-view

initComponents(Vue) 
    let self = this
    Vue.component('router-link', 
      props: 
        to: String,
      ,
      render(h) 
        return h(
          'a',
          
            attrs: 
              href: this.to,
            ,
            on: 
              click: this.handleClick,//绑定事件
            ,
          ,
          [this.$slots.default],
        )
      ,
      methods: 
        handleClick(e) 
          if (self.options.mode === 'history') 
            history.pushState(, '', this.to)
            this.$router.data.current = this.to
           else 
            location.hash = this.to
            this.$router.data.current = this.to.split('#')[1]
          

          e.preventDefault()
        ,
      ,
      //template: '<a :href="to"><slot></slot></a>',
    )

    Vue.component('router-view', 
      render(h) 
        let component = self.routeMap[self.data.current]
        return h(component)
      ,
    )
  

浏览器前进后退事件处理

根据不同模式监听不同的浏览器事件

//注册事件
  initEvent() 
    //history模式
    if (this.options.mode === 'history') 
      window.addEventListener('popstate', () => 
        this.data.current = location.pathname
      )
     else 
      //hash模式
      window.addEventListener('hashchange', () => 
        this.data.current = location.hash.substring(1)
      )
    
  

以上是关于手写VueRouter的主要内容,如果未能解决你的问题,请参考以下文章

手写VueRouter

手写VueRouter

手写vue路由

10分钟教你 手写 Vue-Router

10分钟教你 手写 Vue-Router

10分钟教你 手写 Vue-Router