亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

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

2019-11-19 13:34:45
字體:
來源:轉載
供稿:網友

前言

通過上篇,我們知道前端理由的兩種實現方法,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> 標簽,點擊它便能觸發 hashchange。router-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。

全部源碼參考這里。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产在线一区二区三区| 精品久久久久久久久久久久| 国精产品一区一区三区有限在线| 日本精品视频网站| 国产剧情久久久久久| 日韩精品黄色网| 亚洲成人在线视频播放| 成人做爰www免费看视频网站| 日韩视频在线观看免费| 亚洲在线免费观看| 国产精品91久久久久久| 亚洲女人初尝黑人巨大| 国产婷婷成人久久av免费高清| 亚洲欧洲美洲在线综合| 中文日韩在线视频| 欧美激情欧美激情| 精品国产依人香蕉在线精品| 91性高湖久久久久久久久_久久99| 色老头一区二区三区在线观看| 中文日韩电影网站| 国产精品999999| 色一情一乱一区二区| 亚洲天堂男人的天堂| 欧美精品福利在线| 久久久久国色av免费观看性色| 国产精品网红福利| 伦理中文字幕亚洲| 91av在线影院| 亚洲女同性videos| 国产一区二区三区高清在线观看| 91高清免费在线观看| 久久这里有精品| 欧美日韩国产一中文字不卡| 亚洲精美色品网站| 中文字幕精品—区二区| 欧美在线日韩在线| 亚洲精品欧美日韩| 亚洲成色777777在线观看影院| 日本一区二区在线免费播放| 久久精品电影网站| 亚洲跨种族黑人xxx| 91在线观看欧美日韩| 日本欧美国产在线| 国产精品久久久久久久久久三级| 日本人成精品视频在线| 91在线观看免费高清完整版在线观看| 欧美成年人视频| 亚洲激情视频网| 亚洲r级在线观看| 国产精品久久久久久久天堂| 欧美成人午夜激情在线| 国内精品模特av私拍在线观看| 亚洲国产精品成人va在线观看| 欧美理论在线观看| 国产精品美女主播| 亚洲奶大毛多的老太婆| 国产大片精品免费永久看nba| 午夜精品蜜臀一区二区三区免费| 日本人成精品视频在线| 精品久久中文字幕久久av| 国产日韩av高清| 国产91在线播放九色快色| 亚洲福利精品在线| 国产视频精品在线| 欧美在线视频观看免费网站| 久久综合久久美利坚合众国| 日韩在线高清视频| 中文字幕一区二区精品| 亚洲欧美日韩中文在线制服| 亚洲剧情一区二区| 国内揄拍国内精品| 久久亚洲春色中文字幕| 欧美在线一区二区视频| 欧美大片免费观看| 欧美裸体xxxx| 日本一区二区三区在线播放| 成人国产在线视频| 国产ts一区二区| 一本色道久久88综合亚洲精品ⅰ| 国产性猛交xxxx免费看久久| 欧美成人中文字幕在线| 国产小视频国产精品| 亚洲午夜精品久久久久久久久久久久| 亚洲福利在线观看| 久久精品国产欧美亚洲人人爽| 98午夜经典影视| 久久久免费观看视频| 91精品国产91久久久久| 中文字幕精品一区二区精品| 久久久久久国产| 精品成人久久av| 国产精品免费一区二区三区都可以| 最新国产精品拍自在线播放| 精品中文字幕在线| 日韩欧美高清在线视频| 欧美激情啊啊啊| 国产午夜精品全部视频播放| 2019亚洲男人天堂| 国产福利视频一区二区| 亚洲自拍欧美色图| 亚洲国产精品悠悠久久琪琪| 亚洲国产天堂久久综合| 亚洲欧美国产精品久久久久久久| 69视频在线免费观看| 青草青草久热精品视频在线观看| 亚洲精品成人久久电影| 久久夜色精品国产欧美乱| 国产精国产精品| 国产福利精品视频| 国产精品wwww| 91亚洲精品久久久久久久久久久久| 久久免费视频网站| 亚洲人成毛片在线播放| 欧美成人全部免费| 成人免费视频xnxx.com| 精品国产欧美一区二区三区成人| 91精品国产91久久久久久久久| 亚洲人成欧美中文字幕| 欧美在线播放视频| 久久国产天堂福利天堂| 曰本色欧美视频在线| 久久久人成影片一区二区三区观看| 欧美日韩爱爱视频| 国产中文欧美精品| 91精品视频免费看| 在线播放精品一区二区三区| 国自在线精品视频| 91精品久久久久久久久久另类| 久久人人爽人人爽人人片av高清| 久久久久久综合网天天| 国产一区二区丝袜高跟鞋图片| 色偷偷偷亚洲综合网另类| 国内免费精品永久在线视频| 久久久久999| 国产精品成av人在线视午夜片| 久久天堂电影网| 欧美日韩色婷婷| 在线精品国产成人综合| 精品久久久久久久久国产字幕| 国产日本欧美一区| 大荫蒂欧美视频另类xxxx| 精品久久久在线观看| 97在线观看视频国产| 俺去啦;欧美日韩| 欧美日韩亚洲视频| 欧美性色xo影院| 在线视频亚洲欧美| 亚洲国语精品自产拍在线观看| 欧美性资源免费| 美女久久久久久久久久久| 亚洲天堂男人的天堂| 最近中文字幕mv在线一区二区三区四区| 国产欧美精品一区二区| 国产欧美 在线欧美| 中文字幕一区二区精品| 7777免费精品视频| 国产午夜精品全部视频在线播放| 日本亚洲欧洲色α| 久久精品电影一区二区| 一区二区三区四区在线观看视频| 亚洲精品久久久久久久久久久久| 91精品久久久久久久久久久久久久| 91精品国产91久久久久久久久| 欧美黑人xxx|