成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

vue-roter有幾種模式

vue-roter有3種模式:1、hash模式,用URL hash值來做路由,支持所有瀏覽器;該模式實現的路由,在通過鏈接后面添加““#”+路由名字”。2、history模式,由h5提供的history對象實現,依賴H5 History API和服務器配置。3、abstract模式,支持所有JS運行環境,如Node服務器端,如果發現沒有瀏覽器的API,路由會自動強制進入該模式。

vue-roter有幾種模式

本教程操作環境:windows7系統、vue3版,DELL G3電腦。

Vue-router 是vue框架的路由插件。

vue-roter有幾種模式

vue-roter有幾種模式

根據vue-router官網,我們可以明確看到vue-router的mode值有3種

  • hash

  • history

  • abstract

其中,hash 和 history 是 SPA 單頁應用程序的基礎。

先說結論: spa應用路由有2種模式,hash 和 history,vue路由有3種模式,比 spa 多了一個 abstract。

源碼分析

在vue-router中通過mode這個參數修改路由的模式:

const router = new VueRouter({   mode: 'history',   routes: [...] })

具體怎么實現的呢,首先我們下載 vue-router 的源碼

抽離出來對mode的處理

class vueRouter {     constructor(options) {         let mode = options.mode || 'hash'         this.fallback =         mode === 'history' && !supportsPushState && options.fallback !== false         if (this.fallback) {             mode = 'hash'         }         if (!inBrowser) {             mode = 'abstract'         }         this.mode = mode          switch (mode) {             case 'history':                 this.history = new HTML5History(this, options.base)                 break             case 'hash':                 this.history = new HashHistory(this, options.base, this.fallback)                 break             case 'abstract':                 this.history = new AbstractHistory(this, options.base)                 break             default:                 if (process.env.NODE_ENV !== 'production') {                     assert(false, `invalid mode: ${mode}`)                 }         }     } }

可以看到默認使用的是 hash 模式,當設置為 history 時,如果不支持 history 方法,也會強制使用 hash 模式。 當不在瀏覽器環境,比如 node 中時,直接強制使用 abstract 模式。

hash模式

閱讀這部分源碼前,我們先來了解下 hash 的基礎: 根據MDN上的介紹,Location 接口的 hash 屬性返回一個 USVString,其中會包含URL標識中的 '#' 和 后面URL片段標識符,'#' 和后面URL片段標識符被稱為 hash。 它有這樣一些特點:

  • 在第一個#后面出現的任何字符,都會被瀏覽器解讀為位置標識符。這意味著,這些字符都不會被發送到服務器端。

  • 單單改變#后的部分,瀏覽器只會滾動到相應位置,不會重新加載網頁。

  • 每一次改變#后的部分,都會在瀏覽器的訪問歷史中增加一個記錄,使用"后退"按鈕,就可以回到上一個位置。

  • 可通過window.location.hash屬性讀取 hash 值,并且 window.location.hash 這個屬性可讀可寫。

  • 使用 window.addEventListener("hashchange", fun) 可以監聽 hash 的變化

了解了這些基本知識后,我們繼續來看 vue-router 源碼對 /src/history/hash.js 的處理

    const handleRoutingEvent = () => {       const current = this.current       if (!ensureSlash()) {         return       }       this.transitionTo(getHash(), route => {         if (supportsScroll) {           handleScroll(this.router, route, current, true)         }         if (!supportsPushState) {           replaceHash(route.fullPath)         }       })     }     const eventType = supportsPushState ? 'popstate' : 'hashchange'     window.addEventListener(       eventType,       handleRoutingEvent     )     this.listeners.push(() => {       window.removeEventListener(eventType, handleRoutingEvent)     })

首先也是使用 window.addEventListener("hashchange", fun) 監聽路由的變化,然后使用 transitionTo 方法更新視圖

  push (location: RawLocation, onComplete?: Function, onAbort?: Function) {     const { current: fromRoute } = this     this.transitionTo(       location,       route => {         pushHash(route.fullPath)         handleScroll(this.router, route, fromRoute, false)         onComplete && onComplete(route)       },       onAbort     )   }    replace (location: RawLocation, onComplete?: Function, onAbort?: Function) {     const { current: fromRoute } = this     this.transitionTo(       location,       route => {         replaceHash(route.fullPath)         handleScroll(this.router, route, fromRoute, false)         onComplete && onComplete(route)       },       onAbort     )   }

vue-router 的2個主要API push 和 replace 也是簡單處理了下 hash , 然后調用 transitionTo 方法更新視圖

history模式

老規矩,先來了解下 HTML5History 的的基本知識: 根據MDN上的介紹,History 接口允許操作瀏覽器的曾經在標簽頁或者框架里訪問的會話歷史記錄。 使用 back(), forward()和 go() 方法來完成在用戶歷史記錄中向后和向前的跳轉。 HTML5引入了 history.pushState() 和 history.replaceState() 方法,它們分別可以添加和修改歷史記錄條目。 稍微了解下 history.pushState():

window.onpopstate = function(e) {    alert(2); }  let stateObj = {     foo: "bar", };  history.pushState(stateObj, "page 2", "bar.html");

這將使瀏覽器地址欄顯示為 mozilla.org/bar.html ,但并不會導致瀏覽器加載 bar.html ,甚至不會檢查bar.html 是否存在。 也就是說,雖然瀏覽器 URL 改變了,但不會立即重新向服務端發送請求,這也是 spa應用 更新視圖但不 重新請求頁面的基礎。 接著我們繼續看 vue-router 源碼對 /src/history/html5.js 的處理:

    const handleRoutingEvent = () => {       const current = this.current        // Avoiding first `popstate` event dispatched in some browsers but first       // history route not updated since async guard at the same time.       const location = getLocation(this.base)       if (this.current === START && location === this._startLocation) {         return       }        this.transitionTo(location, route => {         if (supportsScroll) {           handleScroll(router, route, current, true)         }       })     }     window.addEventListener('popstate', handleRoutingEvent)     this.listeners.push(() => {       window.removeEventListener('popstate', handleRoutingEvent)     })

處理邏輯和 hash 相似,使用 window.addEventListener("popstate", fun) 監聽路由的變化,然后使用 transitionTo 方法更新視圖。 push 和 replace 等方法就不再詳細介紹。

abstract模式

最后我們直接來看一下對 /src/history/abstract.js 的處理:

  constructor (router: Router, base: ?string) {     super(router, base)     this.stack = []     this.index = -1   }

首先定義了2個變量,stack 來記錄調用的記錄, index 記錄當前的指針位置

  push (location: RawLocation, onComplete?: Function, onAbort?: Function) {     this.transitionTo(       location,       route => {         this.stack = this.stack.slice(0, this.index + 1).concat(route)         this.index++         onComplete && onComplete(route)       },       onAbort     )   }    replace (location: RawLocation, onComplete?: Function, onAbort?: Function) {     this.transitionTo(       location,       route => {         this.stack = this.stack.slice(0, this.index).concat(route)         onComplete && onComplete(route)       },       onAbort     )   }

push 和 replac方法 也是通過 stack 和 index 2個變量,模擬出瀏覽器的歷史調用記錄。

總結

終于到了最后的總結階段了:

  • hash 和 history 的使用方式差不多,hash 中路由帶 # ,但是使用簡單,不需要服務端配合,站在技術角度講,這個是配置最簡單的模式,本人感覺這也是 hash 被設為默認模式的原因

  • history 模式需要服務端配合處理404的情況,但是路由中不帶 # ,比 hash 美觀一點。

  • abstract 模式支持所有JavaScript運行環境,如Node.js服務器端,如果發現沒有瀏覽器的API,路由會自動強制進入這個模式。

    abstract 模式沒有使用瀏覽器api,可以放到node環境或者桌面應用中,是對 spa應用 的兜底和能力擴展。

【相關視頻教程推薦:vue視頻教程、web前端入門】

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
娇小12-13╳YⅩ╳毛片高清| ZOOM与牛性胶ZOOM| 18禁自慰网址进入| MONSTER无删减动漫| 八戒八戒视频在线WWW观看| 亚洲男人第一AV网站| 欧美VA亚洲VA在线观看| 国产在线精品一区二区中文| 精品无码一区二区Av蜜桃| 久久人人爽人人爽AV片| 欧美激情综合色综合啪啪五月| 免费A级毛片无码免费视频1| 国内精品久久久久久久久电影网| 亚洲AV永久无码精品三区在线 | 妺妺坐在我腿上勃起弄了视频| 差差差很疼APP大全免费下载软| 亚洲尤码不卡AV麻豆| 亚洲AV永久无码成人网站| 女少18XⅩXX性XXXXHD| 狠狠躁夜夜躁AV网站色| 13277大但人文艺术日本活动| 全免费A级毛片免费看视频| 放荡娇妻张开腿任人玩H| 性色AV极品无码专区亚洲| 欧美成人精品一区二区| 国精产品一品二品国精| 精品久久久久久亚洲中文字幕 | 国产AV无码专区亚洲AⅤ蜜芽 | 波多野结衣中文字幕一区二区三区| 驯服人妻HD中字日本| 女人与公拘交酡ZOZO| 国产偷V国产偷V亚洲高清| BT天堂新版中文在线| 亚洲国产精品久久久久婷婷图片| 欧美熟妇精品一区二区蜜桃视频| 国产最新无码AⅤ在线播放| 拔萝卜影视剧免费观看| 亚洲制服丝袜无码AV在线| 亚洲第一天堂无码专区| 男人强撕开奶罩揉捏我奶头视频| 扒开校花的粉嫩小泬| 亚洲日韩欧美一区二区三区 | 人人妻人人澡人人爽不卡视频| 久久久久久久精品妇女99| 福建妹妹幼儿十岁左右| HERMES日本官网的网址| 无码人妻一区二区三区麻豆| 久久国产中文娱乐网| 国产成人无码区免费AⅤ片 | 一对浑圆的胸乳被揉捏动态图| 扒开双腿疯狂进出爽爽爽动态图| 东北少妇高潮流白浆在线观看| 影音先锋亚洲成AⅤ人在| 成人拳交喷水在线播放| 无码少妇丰满熟妇一区二区| 玩小雪跪趴把腿分到最大影视频 | 亚洲老熟女XXXXHDWAA| 色噜噜人体337P人体| 欧美黑人又粗又大久久久| 热RE99久久精品国产99热| 浪荡受NP纯肉公共场合BL男男| 久久亚洲色WWW成人男男| 波多野结衣AV一区二区全免费观看| 在线观看无码AV网站永久| AV在线播放网站| 国产精品导航一区二区| 久久精品国产一区二区三区肥胖| 欧美黑人男士和白人美女a级黄片视频在线播放 | 国产精品爽爽ⅤA在线观看| 韩国电影办公室6免费完整版 | 中国熟妇色XXXX欧美老妇多毛| 播放男人添女人下边视频| 河南妇女毛浓浓BW| 免费观看电视剧全集在线播放 | 国产成人精品视频网站| 久久久久久久久久久精品| 色噜噜狠狠色综合久色AⅤ网| 亚洲色欲一区二区三区在线观看 | 欧美成人一区在线| 亚洲AV成人一区二区三区天堂| CAOPORN最新地址| 极品少妇自慰喷白浆av| 日韩人妻一区二区三区免费| 宅男666在线永久免费观看| 国产精品永久免费视频| 人妻妺妺窝人体色777777| 亚洲午夜成人AV电影| 国产高潮刺激叫喊视频| 欧美一区二区在线视频人妻| 野花日本免费完整版高清版8| 国产成人无码精品午夜福利A| 内射人妻无码色AB麻豆| 亚洲VA久久久噜噜噜久久无码| 亚洲一区制服无码中字| 最新无码人妻在线不卡| 国产 | 欧洲野花视频欧洲1| 国产亚洲精品岁国产微拍精品| 欧美成本人网站免费观看| 欧美日产欧美日产国产精品| 日本少妇自慰高清喷浆| _97夜夜澡人人爽人人喊_欧美 | 久久人人妻人人做人人爽| 亚洲AV极品熟妇一品二品三品 | 肥熟老熟妇500部视频| 漂亮人妻被中出中文字幕| 中文字幕无码精品亚洲资源网| 久久精品动漫一区二区三区 | 免费观看无遮挡WWW的视频| 亚洲一区无码中文字幕| 精品国产亚洲一区二区三区在线观| 无人区码一码二码三码区| 公粗挺进了我的密道在线观看 | 免费一本色道久久一区| 用嘴巴吃鸡的好处| 久久精品国产只有精品2020| 亚洲欧美日韩在线一区| 精产国品一二三产品区别在| 亚洲AV无码专区国产乱码电影 | 亚洲熟女www一区二区三区 | 中文字幕乱码一区二区三区免费| 好男人好资源电影在线播放 | 狂猛欧美激情性XXXX大豆行情| 人人妻人人澡人人爽人人老司机| √8天堂资源地址中文在线| 天堂8А√中文在线官网| 亚洲综合无码久久精品综合| 久久不见久久见免费影院国语| 亚洲精品无码AV专区最新 | 久久精品九九亚洲精品| 亚洲欧洲精品成人久久曰影片| 精品无码久久久久久午夜| 亚洲人成色A777777在线观 | 国产麻豆成人传媒免费观看| 无码国产孕妇一区二区免费AV | 国产SM主人调教女M视频| 天堂AV男人在线播放| 国产裸拍裸体女网站链接在线观看| 无码欧亚熟妇人妻AV在线| 国产网红在线_电影频道| 亚洲GV永久无码天堂网| 精品一区二区三区不卡少妇av| 野花高清中文免费观看视频| 秘密列车在线全集免费观看| ASS少妇PICS粉嫩BBW| 日本JAPANESE 30成熟 | 天美传媒蜜桃传媒精东豆| 国产精品久久久久婷婷五月色| 亚洲AV无码AV日韩AV网站| 久久国产精品二国产精品| 中文乱码人妻系列一区二区| 孽火(硬汉)今又| 被多个强壮的黑人灌满精| 色综合久久无码五十路人妻| 国产女人被狂躁到高潮小说| 亚洲精品自偷自拍无码 | 制服丝袜人妻中文字幕在线| 欧美精品国产综合久久| 大香伊蕉人在播放2019| 午夜三级理论在线观看高清| 九九在线中文字幕无码| 7777成年免费视频| 日本老熟妇ⅩXX| 国产精品一国产精品| 亚洲人成无码网站18禁10| 免费无码AV片在线观看潮喷| 波多野结衣好大好紧好爽| 无码人妻一区二区三区四区AV| 精品人妻人人做人人爽| 50妺妺窝人体色聚窝窝www| 三更2饺子截取一小段| 国内粗鲁VIDEO老熟妇| 在线A毛片免费视频观看| 日本免费黄色网址| 国产午夜无码福利在线看网站| 亚洲综合AV一区二区三区| 欧美熟妇黑人ⅩXXXXX| 国产精品乱码久久久久久小说| 亚洲熟妇无码AV不卡在线播放| 欧美亚洲国产精品久久高清| 国产精品亚洲专区无码唯爱网| 亚洲熟妇无码AV在线少妇| 热久久99这里有精品综合久久| 国产精品无码一区二区三区免费 | 久久久老熟女一区二区三区 | 中国熟妇色XXXXX中国老妇| 日日摸夜夜爽无码毛片精选| 狠狠色噜噜狠狠狠7777奇米| 91精品人妻一区二区三在线 | 十八女人毛片A级毛片水真多| 黑色丝袜老师自慰喷水浪潮免费| 7777色情ⅩXXX欧美色妇| 无码人妻精品一区二区| 久久青青草原精品国产| 成人一区二区三区| 亚洲国产欧美一区二区三区 | 蜜臀AV无码精品人妻色欲| 国产成人AV在线影院| 一区二区狠狠色丁香久久婷婷| 搡老女人老妇女老熟妇| 久久久久国色AV免费观看性色 |