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