国产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 主站蜘蛛池模板: 成人久久久精品乱码一区二区三区 | 伊人网免费视频 | 三级网站免费播放国语 | 日本国产一区二区三区 | 国产精品久久久久免费 | 亚欧洲精品在线视频免费观看 | 欧洲第一页 | 欧美中日韩在线 | 国产淫语打电话对白在线播放 | 亚洲欧洲在线观看 | 久久久久久91香蕉国产 | 成人精品视频在线观看 | 亚洲国产精品久久久久久 | a黄网站| 欧美精品在线看 | 国产精品高清视亚洲一区二区 | 在线视频免费观看 | 国产一区在线播放 | 欧美日韩国产三级 | 国产区精品视频 | 亚洲情a成黄在线观看动 | 欧美日韩精品一区二区在线播放 | 色在线免费视频 | 免费视频一区 | 国产免费高清视频在线观看不卡 | 久久精品视频一区二区三区 | 国偷自产一区二区免费视频 | 日韩欧美一区二区三区在线视频 | 日韩国产在线观看 | 午夜三级视频 | 一区二区精品在线 | 国产亚洲欧美精品久久久 | 91福利一区二区 | 亚洲国产成人久久99精品 | 亚洲欧美日韩一区 | 深夜福利一区二区 | 国产成人精品aaaa视频一区 | 精品国产91久久久久久久 | 久久精品国产亚洲a不卡 | 亚洲精品成人久久久影院 | 国产网站免费 |