内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

vuejs的路由實(shí)現(xiàn)原理是什么

vuejs的路由實(shí)現(xiàn)原理是什么?很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供宜賓網(wǎng)站建設(shè)、宜賓做網(wǎng)站、宜賓網(wǎng)站設(shè)計(jì)、宜賓網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、宜賓企業(yè)網(wǎng)站模板建站服務(wù),10年宜賓做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

一般源碼中,都會用到 window.history 和 location.hash

history 實(shí)現(xiàn)

window.history 對象包含瀏覽器的歷史,window.history 對象在編寫時(shí)可不使用 window 這個(gè)前綴。history是實(shí)現(xiàn)SPA前端路由是一種主流方法,它有幾個(gè)原始方法:

history.back()

與在瀏覽器點(diǎn)擊后退按鈕相同

history.forward()

與在瀏覽器中點(diǎn)擊按鈕向前相同

history.go(n)

接受一個(gè)整數(shù)作為參數(shù),移動到該整數(shù)指定的頁面,比如go(1)相當(dāng)于forward(),go(-1)相當(dāng)于back(),go(0)相當(dāng)于刷新當(dāng)前頁面
如果移動的位置超出了訪問歷史的邊界,以上三個(gè)方法并不報(bào)錯(cuò),而是靜默失敗

在HTML5,history對象提出了 pushState() 方法和 replaceState() 方法,這兩個(gè)方法可以用來向歷史棧中添加數(shù)據(jù),就好像 url 變化了一樣(過去只有 url 變化歷史棧才會變化),這樣就可以很好的模擬瀏覽歷史和前進(jìn)后退了,現(xiàn)在的前端路由也是基于這個(gè)原理實(shí)現(xiàn)的。

history.pushState

pushState(stateObj, title, url) 方法向歷史棧中寫入數(shù)據(jù),其第一個(gè)參數(shù)是要寫入的數(shù)據(jù)對象(不大于640kB),第二個(gè)參數(shù)是頁面的 title, 第三個(gè)參數(shù)是 url (相對路徑)。

stateObj :一個(gè)與指定網(wǎng)址相關(guān)的狀態(tài)對象,popstate事件觸發(fā)時(shí),該對象會傳入回調(diào)函數(shù)。如果不需要這個(gè)對象,此* 處可以填null。
title:新頁面的標(biāo)題,但是所有瀏覽器目前都忽略這個(gè)值,因此這里可以填null。
url:新的網(wǎng)址,必須與當(dāng)前頁面處在同一個(gè)域。瀏覽器的地址欄將顯示這個(gè)網(wǎng)址。
關(guān)于pushState,有幾個(gè)值得注意的地方:

pushState方法不會觸發(fā)頁面刷新,只是導(dǎo)致history對象發(fā)生變化,地址欄會有反應(yīng),只有當(dāng)觸發(fā)前進(jìn)后退等事件(back()和forward()等)時(shí)瀏覽器才會刷新
這里的 url 是受到同源策略限制的,防止惡意腳本模仿其他網(wǎng)站 url 用來欺騙用戶,所以當(dāng)違背同源策略時(shí)將會報(bào)錯(cuò)

history.replaceState

replaceState(stateObj, title, url) 和pushState的區(qū)別就在于它不是寫入而是替換修改瀏覽歷史中當(dāng)前紀(jì)錄,其余和 pushState一模一樣。

popstate事件

定義:每當(dāng)同一個(gè)文檔的瀏覽歷史(即history對象)出現(xiàn)變化時(shí),就會觸發(fā)popstate事件。
注意:僅僅調(diào)用pushState方法或replaceState方法 ,并不會觸發(fā)該事件,只有用戶點(diǎn)擊瀏覽器倒退按鈕和前進(jìn)按鈕,或者使用JavaScript調(diào)用back、forward、go方法時(shí)才會觸發(fā)。另外,該事件只針對同一個(gè)文檔,如果瀏覽歷史的切換,導(dǎo)致加載不同的文檔,該事件也不會觸發(fā)。
用法:使用的時(shí)候,可以為popstate事件指定回調(diào)函數(shù)。這個(gè)回調(diào)函數(shù)的參數(shù)是一個(gè)event事件對象,它的state屬性指向pushState和replaceState方法為當(dāng)前URL所提供的狀態(tài)對象(即這兩個(gè)方法的第一個(gè)參數(shù))。

HISTORY實(shí)現(xiàn)SPA前端路由代碼
<a class="spa">abc.html</a>
<a class="spa">123.html</a>
<a href="/rdhub" class="spa ">rdhub</a>
  // 注冊路由
  document.querySelectorAll('.spa').forEach(item => {
    item.addEventListener('click', e => {
      e.preventDefault();
      let link = item.textContent;
      if (!!(window.history && history.pushState)) {
        // 支持History API
        window.history.pushState({name: 'history'}, link, link);
      } else {
        // 不支持,可使用一些Polyfill庫來實(shí)現(xiàn)
      }
    }, false)
  });

  // 監(jiān)聽路由
  window.addEventListener('popstate', e => {
    console.log({
      location: location.href,
      state: e.state
    })
  }, false)
popstate監(jiān)聽函數(shù)里打印的e.state便是history.pushState()里傳入的第一個(gè)參數(shù),在這里即為{name: 'history'}

hash

hash基本介紹

url 中可以帶有一個(gè) hash http://localhost:9000/#/rdhub.html

window 對象中有一個(gè)事件是 onhashchange,以下幾種情況都會觸發(fā)這個(gè)事件:

  1. 直接更改瀏覽器地址,在最后面增加或改變#hash;

  2. 通過改變location.href或location.hash的值;

  3. 通過觸發(fā)點(diǎn)擊帶錨點(diǎn)的鏈接;

  4. 瀏覽器前進(jìn)后退可能導(dǎo)致hash的變化,前提是兩個(gè)網(wǎng)頁地址中的hash值不同。

hash實(shí)現(xiàn)SPA前端路由代碼
<a href="/rdhub" class="spa">rdhub</a>
<a href="/abc" class="spa">abc</a>
<a href="/123" class="spa">123</a>
<a href="/hash" class="spa">hash</a>
  document.querySelectorAll('.spa').forEach(item => {
    item.addEventListener('click', e => {
      e.preventDefault();
      let link = item.textContent;
      location.hash = link;
    }, false)
  });
  // 監(jiān)聽路由
  window.addEventListener('hashchange', e => {
    console.log({
      location: location.href,
      hash: location.hash
    })
  }, false)

hash模式與history模式,這兩種模式都是通過瀏覽器接口實(shí)現(xiàn)的,除此之外vue-router還為非瀏覽器環(huán)境準(zhǔn)備了一個(gè)abstract模式,其原理為用一個(gè)數(shù)組stack模擬出瀏覽器歷史記錄棧的功能。當(dāng)然,以上只是一些核心邏輯,為保證系統(tǒng)的魯棒性源碼中還有大量的輔助邏輯,也很值得學(xué)習(xí)。

兩種模式比較

pushState設(shè)置的新URL可以是與當(dāng)前URL同源的任意URL;而hash只可修改#后面的部分,故只可設(shè)置與當(dāng)前同文檔的URL

pushState設(shè)置的新URL可以與當(dāng)前URL一模一樣,這樣也會把記錄添加到棧中;而hash設(shè)置的新值必須與原來不一樣才會觸發(fā)記錄添加到棧中

pushState通過stateObject可以添加任意類型的數(shù)據(jù)到記錄中;而hash只可添加短字符串

pushState可額外設(shè)置title屬性供后續(xù)使用

history模式的一個(gè)問題

我們知道對于單頁應(yīng)用來講,理想的使用場景是僅在進(jìn)入應(yīng)用時(shí)加載index.html,后續(xù)在的網(wǎng)絡(luò)操作通過Ajax完成,不會根據(jù)URL重新請求頁面,但是難免遇到特殊情況,比如用戶直接在地址欄中輸入并回車,瀏覽器重啟重新加載應(yīng)用等。

hash模式僅改變hash部分的內(nèi)容,而hash部分是不會包含在HTTP請求中的:

http://rdhub.cn/#/user/id // 如重新請求只會發(fā)送http://rdhub.cn/
故在hash模式下遇到根據(jù)URL請求頁面的情況不會有問題。

而history模式則會將URL修改得就和正常請求后端的URL一樣
http://rdhub.cn/user/id
在此情況下重新向后端發(fā)送請求,如后端沒有配置對應(yīng)/user/id的路由處理,則會返回404錯(cuò)誤。

官方推薦的解決辦法是在服務(wù)端增加一個(gè)覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態(tài)資源,則應(yīng)該返回同一個(gè) index.html 頁面,這個(gè)頁面就是你 app 依賴的頁面。同時(shí)這么做以后,服務(wù)器就不再返回 404 錯(cuò)誤頁面,因?yàn)閷τ谒新窂蕉紩祷?index.html 文件。為了避免這種情況,在 Vue 應(yīng)用里面覆蓋所有的路由情況,然后在給出一個(gè) 404 頁面?;蛘?,如果是用 Node.js 作后臺,可以使用服務(wù)端的路由來匹配 URL,當(dāng)沒有匹配到路由的時(shí)候返回 404,從而實(shí)現(xiàn) fallback。

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。

網(wǎng)站標(biāo)題:vuejs的路由實(shí)現(xiàn)原理是什么
本文地址:http://m.rwnh.cn/article38/igghpp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化用戶體驗(yàn)、ChatGPT、、品牌網(wǎng)站制作動態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司
武定县| 乌拉特后旗| 西畴县| 大连市| 长汀县| 神农架林区| 东港市| 涡阳县| 荔浦县| 舒兰市| 望都县| 兴隆县| 阿尔山市| 苏州市| 和田市| 蓬安县| 昭觉县| 康马县| 弥勒县| 玉林市| 吐鲁番市| 吉安市| 榆林市| 从化市| 尉犁县| 白城市| 涟源市| 普兰店市| 调兵山市| 合水县| 普定县| 即墨市| 鄂州市| 宁阳县| 长泰县| 土默特左旗| 绥宁县| 菏泽市| 西林县| 定西市| 锡林浩特市|