国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答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
當前位置: 首頁 - 科技 - 知識百科 - 正文

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

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

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

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

前言

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

接下來我們就將 Vue 與 Hash 路由結(jié)合,實現(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 之中,路由與組件的關(guān)系:

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ā) hashchangerouter-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é)合,監(jiān)聽了 hashchange 事件,再通過 Vue 的 響應機制 和 組件,便有了上面實現(xiàn)好了一個 vue-router。

全部源碼參考這里。

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

文檔

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

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

最新推薦

猜你喜歡

熱門推薦

專題
Top 主站蜘蛛池模板: 91chinese在线| 一区在线观看 | 亚洲欧美网址 | 亚洲一区二区三区免费 | 性新婚a大黄毛片 | 久久亚洲欧美综合激情一区 | 亚洲欧洲日本在线观看 | 国产成人久久 | 在线永久免费观看的毛片 | 免费精品在线观看 | 日本一区二区三区免费看 | 国产一区二区免费 | 99国产精品高清一区二区二区 | 亚洲欧美在线免费观看 | 国产欧美91 | 国产女人成人精品视频 | 国内精品视频一区二区三区 | 国产免费播放 | 在线视频亚洲 | 亚洲 欧美 中文字幕 | 视频在线一区二区 | 亚洲 欧美综合小说区图片区 | 91国内视频| 国内精品一区二区三区αv 韩国欧美 | 欧美色人| 国产精品第5页 | 亚洲高清色 | 色综合天天娱乐综合网 | 国产观看在线 | 久久久久久综合一区中文字幕 | 欧美日韩亚洲区久久综合 | 国产精品一区欧美日韩制服 | 国产欧美久久一区二区 | 制服丝袜先锋影音 | 亚洲欧美日韩精品专区卡通 | 性欧美xxxx乳高跟 | 国内一区二区三区精品视频 | 久久亚洲伊人成综合人影院 | 视频一区 中文字幕 | 99久久国产亚洲综合精品 | 国产在线精品观看 |