• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題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關(guān)鍵字專題關(guān)鍵字專題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
    當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

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

    來源:懂視網(wǎng) 責(zé)編:小采 時間:2020-11-27 22:13:26
    文檔

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

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

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

    vue router 的初始化使用步驟

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

    使用 vue-router 需要經(jīng)過一下幾個步驟:

    引入 vue-router:

    import VueRouter from 'vue-router';

    利用 vue 的插件機(jī)制,加載 vue-router:

    Vue.use(VueRouter);

    實例化 VueRouter:

    const router = new VueRouter({
    routes
    })

    實例化 Vue:

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

    Vue 的插件機(jī)制

    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;
    }
    
    

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

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

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

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

    利用 vue 的插件機(jī)制,加載 vue-router

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

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

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

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

    1、設(shè)置了兩個 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、設(shè)置 beforeRouteEnter、beforeRouteLeave 和 beforeRouteUpdate 的 merge 策略。merge 策略的介紹可以見 這里 ,簡單來說就是有重復(fù)的值時如何合并。

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

    實例化 VueRouter

    我們來看一下 VueRouter 的構(gòu)造函數(shù)。首先,constructor 會初始化一些屬性:

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

    其中 matcher 比較重要,后面會詳細(xì)說。

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

    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模式。

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

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

    實例化 Vue

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

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

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

    文檔

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

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

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 日韩一区二区三区在线精品| 欧美精品hdvideosex4k| 亚洲国产精品国产自在在线| 久久91精品国产91久久麻豆| 久久夜色精品国产噜噜麻豆 | 国产午夜无码精品免费看动漫| 久久精品一区二区影院| 久久这里只有精品久久| 久久国产亚洲精品无码| 亚洲精品乱码久久久久久自慰| 精品精品国产欧美在线小说区| 欧美亚洲精品在线| 99久久99这里只有免费的精品| 精品人妻系列无码天堂| 熟女精品视频一区二区三区 | 97久久精品人人澡人人爽| 久久精品国产91久久麻豆自制| …久久精品99久久香蕉国产| 国产乱人伦偷精品视频免下载 | 国产精品欧美亚洲韩国日本不卡 | 免费观看四虎精品成人| 国产乱人伦偷精品视频| 亚洲国产精品成| 欧美精品高清在线观看| 国产亚洲婷婷香蕉久久精品| 国产精品综合色区在线观看| 国产精品特级毛片一区二区三区| 精品不卡一区二区| 久久久久女人精品毛片| 久久精品a亚洲国产v高清不卡| 亚洲一区二区三区在线观看精品中文 | 亚洲精品无码久久久久sm| 日产国产精品亚洲系列| 欧美精品一区二区久久| 欧美国产精品va在线观看| 热综合一本伊人久久精品| 青青热久久国产久精品| 午夜精品一区二区三区在线视| 无码国产亚洲日韩国精品视频一区二区三区 | 日本一区二区三区精品国产| 夜夜高潮夜夜爽国产伦精品|