国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題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關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

vue-router 源碼實現(xiàn)前端路由的兩種方式

來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 22:12:12
文檔

vue-router 源碼實現(xiàn)前端路由的兩種方式

vue-router 源碼實現(xiàn)前端路由的兩種方式:在學習 vue-router 的代碼之前,先來簡單了解一下前端路由。 前端路由主要有兩種實現(xiàn)方法: Hash 路由 History 路由 先來看看這兩種方法的實現(xiàn)原理。 接著我們將用它們來簡單實現(xiàn)一個自己的前端路由。 前端路由 Hash 路由 url 的 hash 是以
推薦度:
導讀vue-router 源碼實現(xiàn)前端路由的兩種方式:在學習 vue-router 的代碼之前,先來簡單了解一下前端路由。 前端路由主要有兩種實現(xiàn)方法: Hash 路由 History 路由 先來看看這兩種方法的實現(xiàn)原理。 接著我們將用它們來簡單實現(xiàn)一個自己的前端路由。 前端路由 Hash 路由 url 的 hash 是以

在學習 vue-router 的代碼之前,先來簡單了解一下前端路由。

前端路由主要有兩種實現(xiàn)方法:

  • Hash 路由
  • History 路由
  • 先來看看這兩種方法的實現(xiàn)原理。

    接著我們將用它們來簡單實現(xiàn)一個自己的前端路由。

    前端路由

    Hash 路由

    url 的 hash 是以 # 開頭,原本是用來作為錨點,從而定位到頁面的特定區(qū)域。當 hash 改變時,頁面不會因此刷新,瀏覽器也不會向服務器發(fā)送請求。

    http://www.xxx.com/#/home

    同時, hash 改變時,并會觸發(fā)相應的 hashchange 事件。所以,hash 很適合被用來做前端路由。當 hash 路由發(fā)生了跳轉,便會觸發(fā) hashchange 回調,回調里可以實現(xiàn)頁面更新的操作,從而達到跳轉頁面的效果。

    window.addEventListener('hashchange', function () {
     console.log('render');
    });

    History 路由

    HTML5 規(guī)范中提供了 history.pushStatehistory.replaceState 來進行路由控制。通過這兩個方法,可以實現(xiàn)改變 url 且不向服務器發(fā)送請求。同時不會像 hash 有一個 # ,更加的美觀。但是 History 路由需要服務器的支持,并且需將所有的路由重定向到根頁面。

    History 路由的改變不會去觸發(fā)某個事件,所以我們需要去考慮如何觸發(fā)路由更新后的回調。

    有以下兩種方式會改變 url:

  • 調用 history.pushState 或 history.replaceState;
  • 點擊瀏覽器的前進與后退。
  • 第一個方式可以封裝一個方法,在調用 pushState(replaceState)后再調用回調。

    function push (url) {
     window.history.pushState({}, null, url);
     handleHref();
    }
    
    function handleHref () {
     console.log('render');
    }

    第二個方式,瀏覽器的前進與后退會觸發(fā) popstate 事件。

    window.addEventListener('popstate', handleHref);

    路由實現(xiàn)

    我們通過 <a> 標簽來進行切換路由,通過一個 <div> 標簽來裝載各路由對應的頁面內容。

    參考 vue-router 的調用,我們會這么地調用一個 Router ,將路由與對應組件作為參數(shù)傳入:

    const router = new Router([
     {
     path: '/',
     component: 'home'
     },
     {
     path: '/book',
     component: 'book'
     },
     {
     path: '/movie',
     component: 'movie'
     }
    ]);

    數(shù)組里是各路由對應的要顯示的內容,接下來就來開始實現(xiàn)這個 Router

    Hash 路由實現(xiàn)

    Hash 路由 <a> 標簽都需要帶上 #

    <div>
     <a href="#/" rel="external nofollow" >home</a>
     <a href="#/book" rel="external nofollow" >book</a>
     <a href="#/movie" rel="external nofollow" >movie</a>
     
     <div id="content"></div>
    </div>

    Router 的代碼實現(xiàn)如下:

    class Router {
     constructor (options) {
     this.routes = {};
     
     this.init();
     
     // 遍歷,綁定視圖更新
     options.forEach(item => {
     this.route(item.path, () => {
     	document.getElementById('content').innerHTML = item.component;
     });
     });
     }
     
     // 綁定監(jiān)聽事件
     init () {
     window.addEventListener('load', this.updateView.bind(this), false);
     window.addEventListener('hashchange', this.updateView.bind(this), false);
     }
     
     // 更新試圖
     updateView () {
     const currentUrl = window.location.hash.slice(1) || '/';
     this.routes[currentUrl] && this.routes[currentUrl]();
     }
     
     // 將路由與回調函數(shù)關聯(lián)
     route (path, cb) {
     this.routes[path] = cb;
     }
    }

    實現(xiàn)效果如下:

     

    History 路由實現(xiàn)

    History 路由需要服務器的支持,可以點擊這里 的代碼參考。

    <div>
     <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" data-href="/" rel="external nofollow" >home</a>
     <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" data-href="/book" rel="external nofollow" >book</a>
     <a href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" data-href="/movie" rel="external nofollow" >movie</a>
     
     <div id="content"></div>
    </div>

    Router 的代碼實現(xiàn)如下:

    class Router {
     constructor (options) {
     this.routes = {};
    
     this.init();
     this.bindEvent();
    
     // 遍歷,綁定視圖更新
     options.forEach(item => {
     this.route(item.path, () => {
     document.getElementById('content').innerHTML = item.component;
     });
     });
     }
    
     // 綁定點擊事件
     bindEvent () {
     const _this = this;
     const links = document.getElementsByTagName('a');
    
     [].forEach.call(links, link => {
     link.addEventListener('click', function () {
     const url = this.getAttribute('data-href');
     _this.push(url);
     });
     });
     }
    
     // 綁定監(jiān)聽事件
     init () {
     window.addEventListener('load', this.updateView.bind(this), false);
     window.addEventListener('popstate', this.updateView.bind(this), false);
     }
    
     push (url) {
     window.history.pushState({}, null, url);
     this.updateView();
     }
    
     // 更新試圖
     updateView () {
     const currentUrl = window.location.pathname || '/';
     this.routes[currentUrl] && this.routes[currentUrl]();
     }
    
     // 將路由與回調函數(shù)關聯(lián)
     route (path, cb) {
     this.routes[path] = cb;
     }
    }

    實現(xiàn)效果如下:

    最后

    前端路由實現(xiàn)方式有兩種,分別是:

    1. Hash 路由
    2. History 路由

    原理都是修改 url 的同時不刷新頁面,不向服務器發(fā)送請求,通過監(jiān)聽特殊的事件來更新頁面。

    以上實現(xiàn)全部源碼參考這里。

    聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    vue-router 源碼實現(xiàn)前端路由的兩種方式

    vue-router 源碼實現(xiàn)前端路由的兩種方式:在學習 vue-router 的代碼之前,先來簡單了解一下前端路由。 前端路由主要有兩種實現(xiàn)方法: Hash 路由 History 路由 先來看看這兩種方法的實現(xiàn)原理。 接著我們將用它們來簡單實現(xiàn)一個自己的前端路由。 前端路由 Hash 路由 url 的 hash 是以
    推薦度:
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 日韩免费视频观看 | 亚洲欧洲日韩综合 | 国产精选免费视频 | 国产欧美视频在线观看 | 日韩首页| 亚洲不卡中文字幕 | 亚洲欧美日韩国产综合高清 | 99久久精品国产亚洲 | 精品国产高清自在线一区二区三区 | 精品在线观看免费 | 欧美国产免费 | 国产精品久久久久一区二区 | 日韩亚洲欧美在线爱色 | 国产欧美成人一区二区三区 | 日韩亚洲欧洲在线com91tv | 美女毛片儿 | 亚洲欧美中文日韩综合 | 国产精品视频久久久久久 | 国产亚洲精品成人婷婷久久小说 | 久久国内精品 | 亚洲精品98久久久久久中文字幕 | 欧美日韩国产va另类试看 | 精品久久一区二区三区 | 欧美伊人久久大香线蕉综合69 | 日本一区二区三区在线播放 | 欧美第一精品 | 欧美在线视频 一区二区 | 国产精品国产三级国产普通话一 | 国产成人久久精品一区二区三区 | 精品一区二区三区在线成人 | 亚洲国产天堂久久九九九 | 国产欧美va欧美vahd | 亚洲第一视频区 | 成人a毛片免费视频观看 | 日本三级韩国三级韩级在线观看 | 国产精品麻豆 | 一级免费毛片 | 一本在线| 午夜在线免费视频 | 日韩av线上| 国产日韩一区二区三区 |