Vue-router 中hash模式和history模式的區別

Vue-router 中hash模式和history模式的關系

在vue的路由配置中有mode選項 最直觀的區別就是在url中 hash 帶了一個很丑的 # 而history是沒有#的

mode:"hash";??
mode:"history";??

hash模式和history模式的不同

對于vue這類漸進式前端開發框架,為了構建 SPA(單頁面應用),需要引入前端路由系統,這也就是 Vue-Router 存在的意義。前端路由的核心,就在于 —— 改變視圖的同時不會向后端發出請求。

為了達到這一目的,瀏覽器當前提供了以下兩種支持:

  • hash —— 即地址欄 URL 中的 # 符號(此 hash 不是密碼學里的散列運算)。比如這個 URL:http://www.abc.com/#/hello,hash 的值為 #/hello。它的特點在于:hash 雖然出現在 URL 中,但不會被包括在 HTTP 請求中,對后端完全沒有影響,因此改變 hash 不會重新加載頁面。
  • history —— 利用了 HTML5 History Interface 中新增的 pushState() 和 replaceState() 方法。(需要特定瀏覽器支持)這兩個方法應用于瀏覽器的歷史記錄棧,在當前已有的 back、forward、go 的基礎之上,它們提供了對歷史記錄進行修改的功能。只是當它們執行修改時,雖然改變了當前的 URL,但瀏覽器不會立即向后端發送請求。
  • 因此可以說,hash 模式和 history 模式都屬于瀏覽器自身的特性,Vue-Router 只是利用了這兩個特性(通過調用瀏覽器提供的接口)來實現前端路由.

使用場景

一般場景下,hash 和 history 都可以,除非你更在意顏值,# 符號夾雜在 URL 里看起來確實有些不太美麗。

如果不想要很丑的 hash,我們可以用路由的 history 模式,這種模式充分利用 history.pushState API 來完成URL 跳轉而無須重新加載頁面。

另外,根據 Mozilla Develop Network 的介紹,調用 history.pushState() 相比于直接修改 hash,存在以下優勢:

  • pushState() 設置的新 URL 可以是與當前 URL 同源的任意 URL;而 hash 只可修改 # 后面的部分,因此只能設置與當前 URL 同文檔的 URL;
  • pushState() 設置的新 URL 可以與當前 URL 一模一樣,這樣也會把記錄添加到棧中;而 hash 設置的新值必須與原來不一樣才會觸發動作將記錄添加到棧中;
  • pushState() 通過 stateObject 參數可以添加任意類型的數據到記錄中;而 hash 只可添加短字符串;
  • pushState() 可額外設置 title 屬性供后續使用。

當然啦,history 也不是樣樣都好。SPA 雖然在瀏覽器里游刃有余,但真要通過 URL 向后端發起 HTTP 請求時,兩者的差異就來了。尤其在用戶手動輸入 URL 后回車,或者刷新(重啟)瀏覽器的時候。

個人在接入微信的一個活動開發過程中 開始使用的hash模式,但是后面后端無法獲取到我#后面的url參數,于是就把參數寫在#前面,但是討論后還是決定去掉這個巨丑的#

于是乎改用history模式,但是開始跑流程的時候是沒問題,但是后來發現跳轉后刷新或者回跳,會報一個404的錯誤,找不到指定的路由,最后后端去指向正確的路由 加了/hd/xxx 去匹配是否有這個/hd/{:path} 才得以解決

總結

1 hash 模式下,僅 hash 符號之前的內容會被包含在請求中,如 http://www.abc.com,因此對于后端來說,即使沒有做到對路由的全覆蓋,也不會返回 404 錯誤。

2 history 模式下,前端的 URL 必須和實際向后端發起請求的 URL 一致,如 http://www.abc.com/book/id。如果后端缺少對 /book/id 的路由處理,將返回 404 錯誤。Vue-Router 官網里如此描述:“不過這種模式要玩好,還需要后臺配置支持……所以呢,你要在服務端增加一個覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態資源,則應該返回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面。”

3 結合自身例子,對于一般的 Vue + Vue-Router + Webpack + XXX 形式的 Web 開發場景,用 history 模式即可,只需在后端(Apache 或 Nginx)進行簡單的路由配置,同時搭配前端路由的 404 頁面支持。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249203.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249203.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249203.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nginx Slab內存管理

L38 Slub內存管理適用 ngx_http_limit_conn_module、ngx_http_limit_req_module 模塊場景 我們可以用阿里第三方模塊Slab_Stat模塊 并且用add-module 方式編譯進openresty中 轉載于:https://www.cnblogs.com/jackey2015/p/10684151.html

day2---while else

# -*- coding:utf-8 -*-while 條件&#xff1a;循環體終止循環 else&#xff1a; while else 解釋&#xff1a;當循環體中沒有被break打斷則會運行else&#xff0c;打斷則不會運行else# 例子 a 0 while a < 5:print(a)a 1break else:print(循環結束) # 0 轉載于:https:/…

jQuery中this與$(this)的區別總結

https://www.cnblogs.com/gfl123/p/8080484.html

2019前端必會黑科技之PWA

一、背景 從2018年到現在&#xff0c;作為號稱下一代web應用模型的PWA&#xff0c;逐漸成為了一個各大前端廠商爭先恐后進行涉足&#xff0c;布局的一個新的技術&#xff0c; 其主要的對標物Native app&#xff0c;作為現在最主流的mobile端應用&#xff0c;它的安全&#xff…

Tcpdump抓包工具的使用

# Tcpdump抓包工具的使用## 簡介tcpdump是linux下最常用的命令行抓包工具&#xff0c;可以在線安裝## 安裝- sudo apt install tcpdump## 查看網卡- ip addr查看網卡名稱## 簡單的使用示例- sudo tcpdump -i enp032 抓取指定網卡的數據包&#xff0c;并- sudo tcpdump -i enp03…

Node.js異步庫async

async的使用需要安裝第三方包 1.串行無關聯 async.series 函數依次執行,后面不需要調前面步驟的結果 程序執行時間為所有步驟之和 2.并行無關聯 async.paraller 某步出錯不影響其他步驟執行 程序執行時間為最長的那個時間 3.串行有關聯 async.waterfall 函數依次執行,后面需要…

Java技術棧---語言基礎

基礎語法 面向對象 接口 容器 異常 泛型 反射 注解 I/O

Mongodb 查詢時間類型

$where: this.CreateDate.toJSON().slice(0,13) "2019-04-04T05"轉載于:https://www.cnblogs.com/kevin1988/p/10685075.html

vue prop不同數據類型(數組,對象..)設置默認值

vue prop 會接收不同的數據類型&#xff0c;這里列出了 常用的數據類型的設置默認值的寫法,其中包含&#xff1a; Number, String, Boolean, Array, Function, Object refAge: { type: Number, default: 0 }, refName: { type: String, default: }, hotDataLoading: { typ…

正則表達式——基礎

正則表達式的基本符號使用&#xff1a; 1。基本符號&#xff1a; a . 匹配任意單個字符&#xff0c;如&#xff1a;.000就可以匹配到1000&#xff0c;2000&#xff0c;3000&#xff0c;a000,b000等。 b | 匹配滿足其中一個條件&#xff0c;如&#xff1a; 1000|2000|3000 可以…

談一談并查集QAQ(上)

最近幾日理了理學過的很多oi知識。。。發現不知不覺就有很多的知識忘記了。。。 在聊聊并查集的時候順便當作鞏固吧。。。。 什么是并查集呢? ( Union Find Set ) 是一種用于處理分離集合的抽象數據結構類型。 具體一點: 當我們給出兩個元素的一個無序對&#xff08;a,b&#…

vue的雙向綁定原理及實現

前言 使用vue也好有一段時間了&#xff0c;雖然對其雙向綁定原理也有了解個大概&#xff0c;但也沒好好探究下其原理實現&#xff0c;所以這次特意花了幾晚時間查閱資料和閱讀相關源碼&#xff0c;自己也實現一個簡單版vue的雙向綁定版本&#xff0c;先上個成果圖來吸引各位&a…

python后端將svc文件數據讀入數據庫具體實現

如何用python將svc文件的數據讀入到MySQL數據庫里&#xff0c;在此直接上代碼了&#xff0c;感興趣的朋友可以貼代碼測試&#xff1a; import pandas as pd import os from sqlalchemy import create_engine # 初始化數據庫連接&#xff0c;使用pymysql模塊 # MySQL的用戶&…

作業——8

這個作業屬于哪個課程C語言程序設計Ⅱ這個作業的要求在哪里C語言作業評價標準我在這個課程的目標是指針與字符串這個作業在哪個具體方面幫助我實現目標使用指針與字符串參考文獻指針和字符串&#xff08;基礎知識&#xff09;第七周作業 一 1 、使用函數刪除字符串中的字符 輸入…

Vue實現組件props雙向綁定解決方案

注意&#xff1a; 子組件不能直接修改prop過來的數據&#xff0c;會報錯 方案一&#xff1a; 用data對象中創建一個props屬性的副本 watch props屬性 賦予data副本 來同步組件外對props的修改 watch data副本&#xff0c;emit一個函數 通知到組件外 HelloWorld組件代碼如下…

統計詞頻問題

adict{} xinput().lower() #把單詞大寫字母改為小寫字母 for i in x:if i in [,,.,"",",!]:xx[:x.index(i)]x[x.index(i)1:] #把句子中的非字母字符用切片操作刪掉 asetset(x.split( )) #集合的好處在于不重復 alstx.split( ) for n in aset:tempdict{n:alst.…

正則表達式常用函數

<?php //preg_match("正則表達式","字符串")用于在字符串中查找匹配項 $email "987044391qq.com"; if (preg_match("/^([a-zA-Z0-9])([.a-zA-Z0-9_-])*([.a-zA-Z0-9_-])([.a-zA-Z0-9_-])([.a-zA-Z0-9_-])$/",$email)){ echo 匹…

利用js的閉包原理做對象封裝及調用方法

創建一個js文件&#xff0c;名為testClosure.js&#xff1a; ? 1 2 3 4 5 6 7 8 9 (function () { function a() { alert(i am a); } outFunc function () { a(); } })(); 這里不論寫多少個function,a b c d ...外面都調用不到&#xff0c;包括這里面va…

Flask系列06--(中間件)Flask的特殊裝飾器 before_request,after_request, errorhandler

一.使用 Flask中的特殊裝飾器(中間件)方法常用的有三個 app.before_request # 在請求進入視圖函數之前app.after_request # 在請求結束視圖函數之后 響應返回客戶端之前app.errorhandler(404) # 重定義錯誤信息before_request def func():passafter_request def func(ret): # …

Flask 中內置的 Session

Flask中的Session非常的奇怪,他會將你的SessionID存放在客戶端的Cookie中,使用起來也非常的奇怪 1. Flask 中 session 是需要 secret_key 的 from flask import session app Flask(__name__) app.secret_key "DragonFire" secret_key 實際上是用來加密字符串的,如果…