<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答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
        主站蜘蛛池模板: 毛片A级毛片免费播放| 182tv免费观看在线视频| 亚洲国产成人AV网站| 在线91精品亚洲网站精品成人| 一级毛片免费播放男男| 免费视频精品一区二区三区| 国产成人免费爽爽爽视频| 久久国产成人亚洲精品影院| 亚洲美女激情视频| 精品久久久久亚洲| 免费大学生国产在线观看p| 亚洲色偷拍另类无码专区| 亚洲日本久久久午夜精品| 免费看又黄又爽又猛的视频软件| 日本在线免费观看| 免费大香伊蕉在人线国产 | 亚洲性在线看高清h片| 亚洲日本乱码一区二区在线二产线 | a拍拍男女免费看全片| 男人的天堂亚洲一区二区三区 | 日韩va亚洲va欧洲va国产| 激情亚洲一区国产精品| 你是我的城池营垒免费观看完整版| 999国内精品永久免费观看| 亚洲精品无码mv在线观看网站| 亚洲AV无码一区二区乱子仑| 999在线视频精品免费播放观看| 亚洲无mate20pro麻豆| 67194成手机免费观看| 99久久国产亚洲综合精品| 国产视频精品免费| 亚洲色无码专区一区| 久久久久久精品免费看SSS| 亚洲综合一区无码精品| 中文字幕专区在线亚洲| 无码av免费网站| 亚洲日韩精品无码一区二区三区| 99re免费99re在线视频手机版| 久久久久无码专区亚洲av| 日韩内射激情视频在线播放免费| 亚洲私人无码综合久久网|