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