<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
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        vue-router 源碼之實現一個簡單的 vue-router

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

        vue-router 源碼之實現一個簡單的 vue-router

        vue-router 源碼之實現一個簡單的 vue-router:前言 通過上篇,我們知道前端理由的兩種實現方法,Hash 路由與 History 路由,并且用它們分別實現了一個前端路由。 接下來我們就將 Vue 與 Hash 路由結合,實現一個非常簡單的 vue-router 吧。 開始實現 想象一下,如果自己實現了一個 vue-rout
        推薦度:
        導讀vue-router 源碼之實現一個簡單的 vue-router:前言 通過上篇,我們知道前端理由的兩種實現方法,Hash 路由與 History 路由,并且用它們分別實現了一個前端路由。 接下來我們就將 Vue 與 Hash 路由結合,實現一個非常簡單的 vue-router 吧。 開始實現 想象一下,如果自己實現了一個 vue-rout

        前言

        通過上篇,我們知道前端理由的兩種實現方法,Hash 路由與 History 路由,并且用它們分別實現了一個前端路由。

        接下來我們就將 Vue 與 Hash 路由結合,實現一個非常簡單的 vue-router 吧。

        開始實現

        想象一下,如果自己實現了一個 vue-router,會怎么去使用呢?參考 vue-router 官方的使用方式,看看 html 的使用:

        <div id="app">
         <p>
         <router-link to="#/">home</router-link>
         <router-link to="#/book">book</router-link>
         <router-link to="#/movie">movie</router-link>
         </p>
         <router-view></router-view>
        </div>
        

        這里會有 router-link 和 router-view 兩個組件需要我們來實現。再來看 js 的:

        const Home = { template: '<div>home</div>' };
        const Book = { template: '<div>book</div>' };
        const Movie = { template: '<div>movie</div>' };
        
        const routes = [
         { path: '/', component: Home },
         { path: '/book', component: Book },
         { path: '/movie', component: Movie }
        ];
        
        const router = new VueRouter(Vue, {
         routes
        });
        
        new Vue({
         el: '#app'
        });
        
        

        這里會有我們自己定義的組件 Home、Book 和 Movie,并且有它們各自對應的路由。我們實現的 VueRouter 跟官方的有些區別,在 VueRouter 被 new 時是將 Vue 作為參數傳入,而不是注入掛載到根實例下。

        接下來就是 VueRouter 的實現了。

        VueRouter

        要怎么來實現 VueRouter 呢,先提供一下實現的思路:

        1. 綁定 hashchange 事件,實現前端路由;
        2. 將傳入的路由和組件做一個路由映射,切換哪個路由即可找到對應的組件顯示;
        3. 需要 new 一個 Vue 實例還做響應式通信,當路由改變的時候,router-view 會響應更新;
        4. 注冊 router-link 和 router-view 組件。

        先創建一個 VueRouter:

        class VueRouter {
         constructor (Vue, options) {
         this.$options = options;
         }
        }
        

        綁定事件

        給 VueRouter 添加一個綁定事件的方法,一旦路由發生改變,會觸發 onHashChange 方法。

        constructor (Vue, options) {
         this.init();
        }
        
        // 綁定事件
        init () {
         window.addEventListener('load', this.onHashChange.bind(this), false);
         window.addEventListener('hashchange', this.onHashChange.bind(this), false);
        }
        
        

        路由映射表

        將傳入的 options 設置成一張路由映射表,以便于通過路由查找到對應的組件。

        constructor (Vue, options) {
         this.$options = options;
         this.routeMap = {};
         this.createRouteMap(this.$options);
        }
        
        // 路由映射表
        createRouteMap (options) {
         options.routes.forEach(item => {
         this.routeMap[item.path] = item.component;
         });
        }
        
        

        options 之中,路由與組件的關系:

        const routes = [
         { path: '/', component: Home },
         { path: '/book', component: Book },
         { path: '/movie', component: Movie }
        ];
        

        生成的路由映射表:

        this.routeMap = {
         '/': Home,
         '/book': Book,
         '/movie': Movie
        };
        

        響應

        我們需要 new 一個新的 Vue 實例,將當前路由 current 儲存在其 data 之中,當修改了 current 時,router-view 就會自己去更新視圖。

        constructor (Vue, options) {
         this.app = new Vue({
         data: {
         current: '#/'
         }
         });
        }
        
        // 獲取當前 hash 串
        getHash () {
         return window.location.hash.slice(1) || '/';
        }
        
        
        // 設置當前路徑
        onHashChange () {
         this.app.current = this.getHash();
        }
        
        

        只要在 router-view 里使用到了 this.app.current,一旦更新它,便會更新。

        注冊組件

        router-link 實際上就是一個 <a> 標簽,點擊它便能觸發 hashchangerouter-view 會實現一個 render 方法,將當前路由對應的組件取出,進行渲染。

        constructor (Vue, options) {
         this.initComponent(Vue);
        }
        
        // 注冊組件
        initComponent (Vue) {
         Vue.component('router-link', {
         props: {
         to: String
         },
         template: '<a :href="to" rel="external nofollow" rel="external nofollow" ><slot></slot></a>'
         });
        
         const _this = this;
         Vue.component('router-view', {
         render (h) {
         var component = _this.routeMap[_this.app.current];
         return h(component);
         }
         });
        }
        
        

        完整代碼

        至此,一個簡單的 vue-router 就出來了,全部代碼是這樣的:

        class VueRouter {
         constructor (Vue, options) {
         this.$options = options;
         this.routeMap = {};
         this.app = new Vue({
         data: {
         current: '#/'
         }
         });
        
         this.init();
         this.createRouteMap(this.$options);
         this.initComponent(Vue);
         }
        
         // 綁定事件
         init () {
         window.addEventListener('load', this.onHashChange.bind(this), false);
         window.addEventListener('hashchange', this.onHashChange.bind(this), false);
         }
        
         // 路由映射表
         createRouteMap (options) {
         options.routes.forEach(item => {
         this.routeMap[item.path] = item.component;
         });
         }
        
         // 注冊組件
         initComponent (Vue) {
         Vue.component('router-link', {
         props: {
         to: String
         },
         template: '<a :href="to" rel="external nofollow" rel="external nofollow" ><slot></slot></a>'
         });
        
         const _this = this;
         Vue.component('router-view', {
         render (h) {
         var component = _this.routeMap[_this.app.current];
         return h(component);
         }
         });
         }
        
         // 獲取當前 hash 串
         getHash () {
         return window.location.hash.slice(1) || '/';
         }
        
         // 設置當前路徑
         onHashChange () {
         this.app.current = this.getHash();
         }
        }
        
        

        最后

        將 Vue 與 Hash 路由結合,監聽了 hashchange 事件,再通過 Vue 的 響應機制 和 組件,便有了上面實現好了一個 vue-router。

        全部源碼參考這里。

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

        文檔

        vue-router 源碼之實現一個簡單的 vue-router

        vue-router 源碼之實現一個簡單的 vue-router:前言 通過上篇,我們知道前端理由的兩種實現方法,Hash 路由與 History 路由,并且用它們分別實現了一個前端路由。 接下來我們就將 Vue 與 Hash 路由結合,實現一個非常簡單的 vue-router 吧。 開始實現 想象一下,如果自己實現了一個 vue-rout
        推薦度:
        標簽: VUE 實現 簡單的
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top 主站蜘蛛池模板: 国产精品自在自线免费观看| 国产日韩久久免费影院| 日日麻批免费40分钟日本的| 亚洲欧好州第一的日产suv| 99久在线国内在线播放免费观看| 日本zzzzwww大片免费| 亚洲尹人香蕉网在线视颅| 日韩精品极品视频在线观看免费| 久热综合在线亚洲精品| 久久这里只精品99re免费| 7777久久亚洲中文字幕蜜桃| 三年片在线观看免费观看大全一| 亚洲天天做日日做天天看| 黄页视频在线观看免费| 免费一级成人毛片| 亚洲已满18点击进入在线观看| 四虎国产精品免费永久在线| 亚洲免费观看视频| 免费中文字幕视频| 亚洲无线码一区二区三区| 久久不见久久见免费视频7| 亚洲国产日产无码精品| 麻豆国产VA免费精品高清在线| 免费的黄色的网站| 国产成人无码综合亚洲日韩 | 亚洲第一页在线播放| 拍拍拍无挡视频免费观看1000| 亚洲国产人成网站在线电影动漫| 91短视频免费在线观看| 亚洲色大18成人网站WWW在线播放| 久久久久久国产精品免费无码| 亚洲免费一级视频| 免费人成网站在线高清| 国产成人一区二区三区视频免费| 亚洲av午夜精品无码专区| 成人免费在线看片| 美女免费精品高清毛片在线视| 亚洲av女电影网| 国产免费午夜a无码v视频| 在线亚洲v日韩v| 亚洲VA成无码人在线观看天堂 |