欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue-router 源碼之實現(xiàn)一個簡單的 vue-router

 更新時間:2018年07月02日 14:55:47   作者:cobish  
這篇文章主要介紹了vue-router 源碼之實現(xiàn)一個簡單的 vue-router,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

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

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

開始實現(xiàn)

想象一下,如果自己實現(xiàn)了一個 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 兩個組件需要我們來實現(xiàn)。再來看 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,并且有它們各自對應的路由。我們實現(xiàn)的 VueRouter 跟官方的有些區(qū)別,在 VueRouter 被 new 時是將 Vue 作為參數(shù)傳入,而不是注入掛載到根實例下。

接下來就是 VueRouter 的實現(xiàn)了。

VueRouter

要怎么來實現(xiàn) VueRouter 呢,先提供一下實現(xiàn)的思路:

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

先創(chuàng)建一個 VueRouter:

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

綁定事件

給 VueRouter 添加一個綁定事件的方法,一旦路由發(fā)生改變,會觸發(fā) 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> 標簽,點擊它便能觸發(fā) hashchange。router-view 會實現(xiàn)一個 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 路由結合,監(jiān)聽了 hashchange 事件,再通過 Vue 的 響應機制 和 組件,便有了上面實現(xiàn)好了一個 vue-router。

全部源碼參考這里。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Vue3中watch監(jiān)聽的五種情況詳解

    Vue3中watch監(jiān)聽的五種情況詳解

    watch函數(shù)用于偵聽某個值的變化,當該值發(fā)生改變后,觸發(fā)對應的處理邏輯,本文將給大家介紹了Vue3中watch監(jiān)聽的五種情況,文中通過代碼示例講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2024-03-03
  • 詳解vue 自定義組件使用v-model 及探究其中原理

    詳解vue 自定義組件使用v-model 及探究其中原理

    這篇文章主要介紹了詳解vue 自定義組件使用v-model 及探究其中原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-10-10
  • element合并表格行的方法實現(xiàn)

    element合并表格行的方法實現(xiàn)

    本文主要介紹了element合并表格行的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • vue中v-for和v-if一起使用之使用compute的示例代碼

    vue中v-for和v-if一起使用之使用compute的示例代碼

    這篇文章主要介紹了vue中v-for和v-if一起使用之使用compute的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • Vue3?計算屬性的用法詳解

    Vue3?計算屬性的用法詳解

    學過?vue2?的寶子們應該都清楚,計算屬性這個東西在項目開發(fā)過程中使用的還是比較頻繁的,使用頻率相對來說比較高。本文就來為大家介紹一下Vue3中計算屬性的用法,需要的可以參考一下
    2022-07-07
  • 一款移動優(yōu)先的Solid.js路由solid router stack使用詳解

    一款移動優(yōu)先的Solid.js路由solid router stack使用詳解

    這篇文章主要為大家介紹了一款移動優(yōu)先的Solid.js路由solid router stack使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Vue實現(xiàn)大屏頁面的屏幕自適應

    Vue實現(xiàn)大屏頁面的屏幕自適應

    這篇文章主要為大家詳細介紹了Vue實現(xiàn)大屏頁面的屏幕自適應,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Vue使用sign-canvas實現(xiàn)在線手寫簽名的實例

    Vue使用sign-canvas實現(xiàn)在線手寫簽名的實例

    sign-canvas?一個基于?canvas?開發(fā),封裝于?Vue?組件的通用手寫簽名板(電子簽名板),支持?pc?端和移動端,本文給大家分享Vue使用sign-canvas實現(xiàn)在線手寫簽名,感興趣的朋友一起看看吧
    2022-05-05
  • vue實現(xiàn)面包屑的方法

    vue實現(xiàn)面包屑的方法

    這篇文章主要為大家詳細介紹了vue實現(xiàn)面包屑的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue使用QrcodeVue生成二維碼并下載的示例代碼

    Vue使用QrcodeVue生成二維碼并下載的示例代碼

    這篇文章主要給大家介紹了Vue使用QrcodeVue生成二維碼并下載的示例,文章中有詳細的代碼示例供大家參考,感興趣的小伙伴可以參考閱讀下
    2023-08-08

最新評論