美文网首页
二、路由安装

二、路由安装

作者: zdxhxh | 来源:发表于2020-02-02 20:05 被阅读0次

插件

Vue.js 提供插件机制,即Vue.use(plugin) 安装VueRouter,这个插件会调用 plugin 对象的install 方法。

所以 Vue.use(plugin),plugin必须拥有一个install方法

如果Vue检测到plugin,并且有install 方法, 则会调用 plugin.install.call(vm,Vue)

而在路由安装过程中,他会做以下事情

  • 装饰beforeCreate该钩子函数,对this._router.history.current进行双向绑定,在该值改变的时候触发视图的更新,同时在该钩子触发router.init()方法
  • 定义$router$routeVue原型链上
  • 注册了两个视图组件 也就是 route-viewlink

源码分析

在index.js 中

import { install } from './install'
// 赋值 install
VueRouter.install = install

在./install中

import View from './components/view'
import Link from './components/link'
// 导出一个Vue的引用 它不想把Vue打包进插件 而又想使用Vue的某些方法
export let _Vue 
export function install (Vue) {
  // 如果已经安装了,并且 _Vue有Vue的引用 则退出
  if (install.installed && _Vue === Vue) return
  install.installed = true

  _Vue = Vue
  // 定义一个判断对象是否有定义的方法 
  const isDef = v => v !== undefined

  const registerInstance = (vm, callVal) => {
    let i = vm.$options._parentVnode
    // i = vm.$options._parentVnode.data.registerRouteInstance
    if (isDef(i) && isDef(i = i.data) && isDef(i = i.registerRouteInstance)) {
      i(vm, callVal)
    }
  }
  // 使用Vue.mixin 装饰 beforeCreate、destoryed方法
  Vue.mixin({
    beforeCreate () {
      // 根据optiosn.router判断是否为根节点
      if (isDef(this.$options.router)) {
        // 如果this是根节点 
        this._routerRoot = this // 私有属性 : 路由根节点
        this._router = this.$options.router // 私有属性 router引用
        this._router.init(this) // 触发router的init方法
        // 这一步很关键,监听_route的改变 会触发视图的更新 第二个参数为默认值
        Vue.util.defineReactive(this, '_route', this._router.history.current)
      } else {
        // 如果this是子节点 
        // 将 _ routerRoot赋值为 父节点
        this._routerRoot = (this.$parent && this.$parent._routerRoot) || this
      }
      // 通过registerRouteInstance方法注册router实例 
      registerInstance(this, this)
    },
    destroyed () {
      registerInstance(this)
    }
  })
  // this._routerRoot._router = this._router.history.current
  // 使用 this.$router.push / go 实际上就是该对象
  Object.defineProperty(Vue.prototype, '$router', {
    get () { return this._routerRoot._router }
  })
  // 定义$route 属性 拿到当前url对应的路由对象
  Object.defineProperty(Vue.prototype, '$route', {
    get () { return this._routerRoot._route }
  })
  // 这里注册了两个视图组件 也就是 route-view 与 link 
  Vue.component('RouterView', View) 
  Vue.component('RouterLink', Link)
  // 该对象保存了两个option合并的规则 TODO 
  const strats = Vue.config.optionMergeStrategies
  // use the same hook merging strategy for route hooks
  strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created
}

相关文章

  • 二、路由安装

    插件 Vue.js 提供插件机制,即Vue.use(plugin) 安装VueRouter,这个插件会调用 plu...

  • react.js路由的使用方法

    1 基本路由 步骤一:安装路由 npm install react-router-dom --save 步骤二:引...

  • vue-router

    一 :安装方式 a:CDN引入或者直接下载 b:npm安装 模块化工程 二:路由运作方式 a:使用路由 b:定义路...

  • vue学习笔记(七)路由及跳转,二级路由创建

    路由 安装:script引入方式: npm方式: 引用: 使用: //:to可以通过路由name进行跳转 跳转 二...

  • vue-router、vue-cli

    路由 一 、安装router二 、引用 三 、配置路由文件,并在vue实例中注入 导出export default...

  • 5.KOA 路由

    路由 一、依靠 ctx.request.url 手动处理 二、使用 koa-router 中间件 安装 路由用法 ...

  • 跨网段DHCP的配置

    一、给路由器安装上模块 路由器0、1、2都接上模块TX 二、端口IP配置 路由器2: Router>enable ...

  • express 基于 passport,passport-jwt

    一、 安装 二、passport-jwt策略 三、路由 四、完整代码app.js

  • express的路由嵌套

    一、安装依赖 二、简单的路由 以前我都是这样直接写路由。一个路由对应一个路径,没有任何嵌套。 现在我们就可以发挥应...

  • vmware 外网无法访问docker容器

    一、排查:查看路由 二、原因: harbor镜像仓库开启chart功能,安装的时候默认添加了这两个路由,由于是项目...

网友评论

      本文标题:二、路由安装

      本文链接:https://www.haomeiwen.com/subject/cuaqxhtx.html