国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

詳解vue-router 初始化時做了什么

來源:懂視網 責編:小采 時間:2020-11-27 22:13:26
文檔

詳解vue-router 初始化時做了什么

詳解vue-router 初始化時做了什么:最近因為業務需要,實現了一個簡單的前端 router,正好也來看一下 vue router 是怎么實現的。這次先來一起看看 vue-router 初始化時做了什么。 vue router 的初始化使用步驟 我們首先來看 vue-router 的使用步驟,然后再分別去看各個步驟都發生了什么。
推薦度:
導讀詳解vue-router 初始化時做了什么:最近因為業務需要,實現了一個簡單的前端 router,正好也來看一下 vue router 是怎么實現的。這次先來一起看看 vue-router 初始化時做了什么。 vue router 的初始化使用步驟 我們首先來看 vue-router 的使用步驟,然后再分別去看各個步驟都發生了什么。

最近因為業務需要,實現了一個簡單的前端 router,正好也來看一下 vue router 是怎么實現的。這次先來一起看看 vue-router 初始化時做了什么。

vue router 的初始化使用步驟

我們首先來看 vue-router 的使用步驟,然后再分別去看各個步驟都發生了什么。

使用 vue-router 需要經過一下幾個步驟:

引入 vue-router:

import VueRouter from 'vue-router';

利用 vue 的插件機制,加載 vue-router:

Vue.use(VueRouter);

實例化 VueRouter:

const router = new VueRouter({
routes
})

實例化 Vue:

const app = new Vue({
router
}).$mount('#app');

Vue 的插件機制

vue 提供了一個 use 方法,來加載插件:

Vue.use = function (plugin: Function | Object) {
 const installedPlugins = (this._installedPlugins || (this._installedPlugins = []));
 if (installedPlugins.indexOf(plugin) > -1) {
 return this;
 }

 // additional parameters
 const args = toArray(arguments, 1);
 args.unshift(this);
 if (typeof plugin.install === 'function') {
 plugin.install.apply(plugin, args);
 } else if (typeof plugin === 'function') {
 plugin.apply(null, args);
 }
 installedPlugins.push(plugin);
 return this;
}

該方法首先檢查插件是否已經加載,如果已經加載,直接返回 this。

如果沒有加載過,會取所有的參數,并將 this 放在第一個。優先執行 plugin.install 方法,若不能執行,則直接執行 plugin 自身。

最后將 plugin push 到插件列表中。

那么我們就需要看 VueRouter 的 install 方法做了什么,VueRouter 類定義在 src/index.js 文件中。

利用 vue 的插件機制,加載 vue-router

入口文件 index.js 對外 export 了一個 VueRouter 類。VueRouter 類包含了 router 的各種方法,我們直接先來看一下 install 方法。

install 方法在 index.js 中綁定在 VueRouter 類上:

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

它的實際實現是在 ./install.js 中,install 方法主要做了以下幾個事情:

1、設置了兩個 mixin:beforeCreate 和 destroyed。

Vue.mixin({
 beforeCreate () {
 if (isDef(this.$options.router)) {
 this._routerRoot = this
 this._router = this.$options.router
 this._router.init(this)
 Vue.util.defineReactive(this, '_route', this._router.history.current)
 } else {
 this._routerRoot = (this.$parent && this.$parent._routerRoot) || this
 }
 registerInstance(this, this)
 },
 destroyed () {
 registerInstance(this)
 }
})

2、在 Vue 上綁定 $route 和 $router。

Object.defineProperty(Vue.prototype, '$router', {
 get () { return this._routerRoot._router }
})

Object.defineProperty(Vue.prototype, '$route', {
 get () { return this._routerRoot._route }
})

3、注冊兩個組件,View 和 Link。

Vue.component('RouterView', View)
Vue.component('RouterLink', Link)

4、設置 beforeRouteEnter、beforeRouteLeave 和 beforeRouteUpdate 的 merge 策略。merge 策略的介紹可以見 這里 ,簡單來說就是有重復的值時如何合并。

const strats = Vue.config.optionMergeStrategies
// use the same hook merging strategy for route hooks
strats.beforeRouteEnter = strats.beforeRouteLeave = strats.beforeRouteUpdate = strats.created

實例化 VueRouter

我們來看一下 VueRouter 的構造函數。首先,constructor 會初始化一些屬性:

this.app = null
this.apps = []
this.options = options
this.beforeHooks = []
this.resolveHooks = []
this.afterHooks = []
this.matcher = createMatcher(options.routes || [], this)

其中 matcher 比較重要,后面會詳細說。

之后會決定使用哪種模式:

let mode = options.mode || 'hash'
this.fallback = mode === 'history' && !supportsPushState && options.fallback !== false
if (this.fallback) {
 mode = 'hash'
}
if (!inBrowser) {
 mode = 'abstract'
}
this.mode = mode

switch (mode) {
 case 'history':
 this.history = new HTML5History(this, options.base)
 break
 case 'hash':
 this.history = new HashHistory(this, options.base, this.fallback)
 break
 case 'abstract':
 this.history = new AbstractHistory(this, options.base)
 break
 default:
 if (process.env.NODE_ENV !== 'production') {
 assert(false, `invalid mode: ${mode}`)
 }
}

由于 history 模式中的pushstate方法還有一些瀏覽器沒有支持。history 模式在瀏覽器不支持時會回退到hash模式。

之后根據不同模式選擇實例化不同模式的history類,可以看到 hash 模式和 history 模式分別對應了 HashHistory 和 HTML5History 兩個類。

此外,如果是服務器端渲染,需要進行 router 匹配來獲取要渲染的頁面。此時服務器環境中沒有history api,因此要自行抽象實現一個,就是 AbstractHistory。

實例化 Vue

實例化為Vue 類時,會將 VueRouter 的實例傳入,這個變量放在 this.$options.router 中。由于 vue router 時以插件形式引入的,因此 這個 this.$options.router 還是給 vue router 自身來用的。

vue router 初始化所做的事情就是這些,下篇博客我們來一起看一下 vue router 實際運行時發生了什么。

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

詳解vue-router 初始化時做了什么

詳解vue-router 初始化時做了什么:最近因為業務需要,實現了一個簡單的前端 router,正好也來看一下 vue router 是怎么實現的。這次先來一起看看 vue-router 初始化時做了什么。 vue router 的初始化使用步驟 我們首先來看 vue-router 的使用步驟,然后再分別去看各個步驟都發生了什么。
推薦度:
  • 熱門焦點

最新推薦

猜你喜歡

熱門推薦

專題
Top
主站蜘蛛池模板: 国产传媒一区二区三区四区五区 | 欧美系列在线 | 国产手机精品一区二区 | 亚洲一区综合 | 国产精品麻豆 | 国产精品久久国产精麻豆99网站 | 全免费a级毛片免费看不卡 日本二区在线观看 | 国产在线视频资源 | 欧美另类色 | 亚洲 欧美 日韩在线一区 | 免费又黄又爽又猛大片午夜 | 国产成人精品曰本亚洲 | 一级毛片免费网站 | 国产九区 | 亚洲五月婷婷 | 成人国产精品一级毛片视频 | 在线观看欧美日韩 | 在线日韩欧美 | 亚洲自拍偷拍网 | 日韩专区在线 | 欧美在线不卡视频 | 欧美午夜视频在线 | 黄色a级毛片| 精品久久久久久综合网 | 国产成人久久精品激情 | 一本色道久久88综合亚洲精品高清 | 精品久久久久久久一区二区手机版 | 手机在线国产视频 | 免费在线观看亚洲 | 香蕉视频啪啪 | 欧美亚洲国产精品久久久 | 欧美伊人久久大香线蕉综合69 | 欧美日韩电影在线观看 | 欧美精品一区二区在线观看播放 | 欧美另类在线观看 | 国产日本精品 | 国产精品视频免费观看 | 日韩有码在线播放 | 亚洲性一区 | 国产日韩欧美 | 国产一区三区二区中文在线 |