摘要:前言在前端單頁面應(yīng)用里面路由是比較重要的部分現(xiàn)有的路由系統(tǒng)從簡(jiǎn)易的到等內(nèi)置路由,功能一步步增強(qiáng)。那么這些系統(tǒng)原理是什么呢本文將分析并實(shí)現(xiàn)一份簡(jiǎn)易的路由以闡述其工作原理。
前言
在前端單頁面應(yīng)用里面,路由是比較重要的部分,現(xiàn)有的路由系統(tǒng)從簡(jiǎn)易的director.js到backbone,react等內(nèi)置路由,功能一步步增強(qiáng)。那么這些系統(tǒng)原理是什么呢,本文將分析并實(shí)現(xiàn)一份簡(jiǎn)易的路由,以闡述其工作原理。
簡(jiǎn)易路由實(shí)現(xiàn)以hash做示范,其運(yùn)行機(jī)制如下:
儲(chǔ)存hash與對(duì)應(yīng)的回調(diào)函數(shù),以key,value的形式存入對(duì)象cache中
設(shè)置監(jiān)聽函數(shù)onhashchange監(jiān)聽url的hash變化
一旦hash變化,則遍歷cache對(duì)象,將屬性key做正則處理,生成對(duì)應(yīng)的正則,再將其拿去和hash做正則匹配,匹配到后執(zhí)行相應(yīng)的value/回調(diào)函數(shù)
回調(diào)函數(shù)中執(zhí)行渲染ui的代碼,進(jìn)而更新頁面
router.js
function Router() { this.cache = {}; //將url/callback 以key/value形式儲(chǔ)存在cache內(nèi) this.on = function (key, value) { var cache = this.cache; cache[key] = value; }; //匹配hash對(duì)應(yīng)的回調(diào)函數(shù),并觸發(fā) this.trigger = function (hash) { var cache = this.cache; for (var r in cache) { var reg = this.initRegexps(r); if (reg.test(hash)) { var callback = cache[r] || function () { }; var params = this.getParams(reg, hash); callback.apply(this, params); } } }; //初始化 添加監(jiān)聽瀏覽器hashchange 以及dom loaded函數(shù) this.init = function () { window.addEventListener("hashchange", function () { var hash = location.hash.slice(1); router.trigger(hash); }); window.addEventListener("load", function () { var hash = location.hash.slice(1) || "default"; router.trigger(hash); }) }; /** *將cache內(nèi)的key 做正則處理,并返回 * 第一個(gè)正則 匹配諸如/,.+-?$#{}[]] 關(guān)鍵字 并在關(guān)鍵字前面加轉(zhuǎn)譯字符 * 第二個(gè)正則 匹配() 標(biāo)示()內(nèi)部?jī)?nèi)容可有可無 * 第三個(gè)正則 匹配: 在/后面可以由接受任意字符,直到遇到下一個(gè)/ * 第四個(gè)正則 匹配* 在*后面可以由接受任意字符 */ this.initRegexps = function (route) { route = route.replace(/[/,.+-?$#{}[]]/g, "$&") .replace(/((.*?))/g, "(?:$1)?") .replace(/(/w?:w+)+/g, "/([^/]+)") .replace(/*w*/g, "([^?]*?)"); return new RegExp("^" + route + "$"); }; //將匹配的正則返回,為回調(diào)函數(shù)提供參數(shù) this.getParams = function (reg, hash) { return reg.exec(hash).slice(1); } }
index.html
代碼地址
點(diǎn)擊查看本文完整代碼
效果圖 流程圖 歸納雖然本文實(shí)現(xiàn)比較簡(jiǎn)單,但很多框架的內(nèi)部路由也是基于這種機(jī)制,只不過有基于對(duì)自身的特性做了一些優(yōu)化。
最后本文有什么不完善的地方,或者流程圖有待改進(jìn)的地方,敬請(qǐng)斧正。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/80204.html
摘要:方案選擇基礎(chǔ)框架請(qǐng)求服務(wù)代理轉(zhuǎn)發(fā)其余日志處理,路由,后端模板引擎,異步語法自己選擇了。 初衷:我并不想改變團(tuán)隊(duì)原有開發(fā)模式,前端負(fù)責(zé)展現(xiàn)和界面路由,后端單純負(fù)責(zé)API;要解決的問題:1.服務(wù)端渲染(部分界面【商品界面】需要使用服務(wù)器端渲染,但是管理類型界面并不需要服務(wù)器端渲染);2.由于問題1的出現(xiàn),所以我們需要服務(wù)器端渲染,需要控制路由,需要部分界面使用后端模板引擎。3.當(dāng)然我不想寫...
摘要:項(xiàng)目簡(jiǎn)介主要是通過做一個(gè)多人在線多房間群聊的小項(xiàng)目來練手全棧技術(shù)的結(jié)合運(yùn)用。編譯運(yùn)行開啟服務(wù),新建命令行窗口啟動(dòng)服務(wù)端,新建命令行窗口啟動(dòng)前端頁面然后在瀏覽器多個(gè)窗口打開,注冊(cè)不同賬號(hào)并登錄即可進(jìn)行多用戶多房間在線聊天。 項(xiàng)目簡(jiǎn)介 主要是通過做一個(gè)多人在線多房間群聊的小項(xiàng)目、來練手全棧技術(shù)的結(jié)合運(yùn)用。 項(xiàng)目源碼:chat-vue-node 主要技術(shù): vue2全家桶 + socket....
摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門,久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...
摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥雀呼晴,侵曉窺檐語。葉上初陽乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門,久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...
閱讀 1268·2023-04-26 01:38
閱讀 1469·2021-11-15 11:39
閱讀 3259·2021-09-22 15:43
閱讀 2653·2019-08-30 15:55
閱讀 2057·2019-08-30 14:17
閱讀 2859·2019-08-29 14:16
閱讀 3071·2019-08-26 18:36
閱讀 2616·2019-08-26 12:19