前端路由原理

一.路由底層實(shí)現(xiàn)方式

1.利用監(jiān)聽hash變化

<body>
    <a href='#/a'>a</a>
    <a href='#/b'>b</a>
 
    <script type="text/javascript">
      window.addEventListener('hashchange', () => {
        console.log(window.location.hash);
      })
    </script>
</body>
瀏覽器會監(jiān)聽對應(yīng)的變化

2.利用HTML5 模式的History

<body>
    <a onClick="push('/a')" >a</a>
    <a onClick="push('/b')" >b</a>
 
    <script type="text/javascript">
     
    function push(path) {
      history.pushState({b: path}, null, path);
    }
    </script>
  </body>
image

瀏覽器地址自動改變豫喧,并且不會帶有#號

兩種模式對比

  1. Hash 模式只可以更改 # 后面的內(nèi)容,History 模式可以通過 API 設(shè)置任意的同源 URL
  2. History 模式可以通過 API 添加任意類型的數(shù)據(jù)到歷史記錄中臭增,Hash 模式只能更改哈希值横辆,也就是字符串
  3. Hash 模式無需后端配置撇他,并且兼容性好。History 模式在用戶手動輸入地址或者刷新頁面的時候會發(fā)起 URL 請求,后端需要配置 1index.html 頁面用于匹配不到靜態(tài)資源的時候

二逆粹、簡易版哈希方式實(shí)現(xiàn)路由

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <meta name="author" content="">
    <title>原生模擬 Vue 路由切換</title>
    <style type="text/css">
        .box,
        #router-view {
            max-width: 1000px;
            margin: 50px auto;
            padding: 0 20px;
        }
    </style>
</head>

<body>
    <div class="box">
        <a href="/home" class="router">主頁</a>
        <a href="/mine" class="router">我的</a>
        <a href="/team" class="router">組</a>
    </div>
    <div id="router-view"></div>
    <script type="text/javascript">
        function Vue(parameters) {
            let vue = {};
            vue.routes = parameters.routes || [];
            vue.init = function() {
                document.querySelectorAll(".router").forEach((item, index) => {
                    item.addEventListener("click", function(e) {
                        let event = e || window.event;
                        event.preventDefault();
                        window.location.hash = this.getAttribute("href");

                        console.log('lalala');
                    }, false);
                });

                window.addEventListener("hashchange", () => {
                    vue.routerChange();
                });

                vue.routerChange();
            };
            vue.routerChange = () => {
                let nowHash = window.location.hash;
                let index = vue.routes.findIndex((item, index) => {
                    return nowHash == ('#' + item.path);
                });
                if (index >= 0) {
                    document.querySelector("#router-view").innerHTML = vue.routes[index].component;
                } else {
                    let defaultIndex = vue.routes.findIndex((item, index) => {
                        return item.path == '*';
                    });
                    if (defaultIndex >= 0) {
                        window.location.hash = vue.routes[defaultIndex].redirect;
                    }
                }
            };

            vue.init();
        }

        new Vue({
            routes: [{
                path: '/home',
                component: "<h1>主頁</h1>"
            }, {
                path: '/mine',
                component: "<h1>我的</h1>"
            }, {
                path: '/team',
                component: '<h1>組</h1>'
            }, {
                path: '*',
                redirect: '/home'
            }]
        });
    </script>
</body>

</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末募疮,一起剝皮案震驚了整個濱河市炫惩,隨后出現(xiàn)的幾起案子僻弹,更是在濱河造成了極大的恐慌,老刑警劉巖他嚷,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹋绽,死亡現(xiàn)場離奇詭異,居然都是意外死亡筋蓖,警方通過查閱死者的電腦和手機(jī)卸耘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門益楼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來折柠,“玉大人,你說我怎么就攤上這事癌瘾∥拖拢” “怎么了翰铡?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長讽坏。 經(jīng)常有香客問我锭魔,道長,這世上最難降的妖魔是什么路呜? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任迷捧,我火速辦了婚禮,結(jié)果婚禮上胀葱,老公的妹妹穿的比我還像新娘漠秋。我一直安慰自己,他們只是感情好抵屿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布庆锦。 她就那樣靜靜地躺著,像睡著了一般晌该。 火紅的嫁衣襯著肌膚如雪肥荔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天朝群,我揣著相機(jī)與錄音燕耿,去河邊找鬼。 笑死姜胖,一個胖子當(dāng)著我的面吹牛誉帅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼蚜锨,長吁一口氣:“原來是場噩夢啊……” “哼档插!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亚再,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤郭膛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后氛悬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體则剃,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年如捅,在試婚紗的時候發(fā)現(xiàn)自己被綠了棍现。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡镜遣,死狀恐怖己肮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悲关,我是刑警寧澤谎僻,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站坚洽,受9級特大地震影響戈稿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜讶舰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一鞍盗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧跳昼,春花似錦般甲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至堪伍,卻和暖如春锚烦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帝雇。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工涮俄, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尸闸。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓彻亲,卻偏偏與公主長得像孕锄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苞尝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344