搜尋
首頁web前端js教程vue行動端路由切換案例解析

vue行動端路由切換案例解析

May 21, 2018 pm 03:20 PM
切換案例解析

這次帶給大家vue行動端路由切換案例解析,vue行動端路由切換的注意事項有哪些,以下就是實戰案例,一起來看一下。

其中最主要的時以下兩個問題:

瀏覽器導覽列的切換

IOS 上滑動切換時,會有兩次頁面的轉場動畫,一次自身滑動時進行的切換,隨後觸發我們設定的轉場動畫。

除了上面兩個問題,其餘的操作都是可以在頁面內進行設置,基本上都是可控的。主要就是解決上面兩個問題。

可以看下實際寫出來的效果:線上DEMO

1. 瀏覽器導覽列的切換

##透過記錄歷史記錄來比較判斷前進或後退

如下範例


A頁面-> B頁面-> C頁面


假如我從A頁面到B頁面再到C頁面,歷史記錄就會產生3條

我們用一個陣列表示: ['/a', '/b', '/c']

然後我在透過點擊瀏覽器導覽列的後退按鈕, 我便會回到B 頁面,

這時候我只要判斷是否存在B頁面, 存在就證明我點的時後退按鈕。

然後只要我退過, 我就能點擊瀏覽器的前進按鈕了。這時候怎麼判斷它到底是前進的呢。

我們可以這樣。

當我們後退到了B頁面,歷史記錄不是還保存著['/a', '/b', '/c'] 三個路徑嗎

我們可以刪除B頁面後面的路徑,那現在就是['/a', '/b'];

如果我們後退到A頁面, 那麼我們保存的路徑就是['/a']

#只要我們點擊前進按鈕, 我們去保存的路徑裡面找, 是不是就找不到路徑了, 那樣就完成了前進判斷。

上面是正常的情況。

但是假如我們有點頁面重複進入了呢。

就如以下這種情況

A頁面-> B頁面-> C頁面-> B頁面-> C頁面

現在走了5步,到達了第二個C頁面, 然後我們後退一步,到達了B頁面


這個時候問題就出來了,我們是刪除第一個B頁面後面的路徑還是刪除第二個B頁面後面的路徑

我們先試著刪除第二個B頁面的路徑,那麼我們還保存的路徑就是: ['/a', '/b', '/c', '/b']。


1、那這個時候我們按照上面正常情況的邏輯來操作.


#我點擊前進, 然後我去保存的路徑裡面找,找不到就算前進, 找到證明是後退。


那麼結果顯而易見,我們找到了第一個C頁面,那就這樣就算後退了,但其實我點擊的時前進


2、那我們試著刪除第一個B頁面後面的路徑,那麼儲存的路徑就是: ['/a', '/b'],


那麼我在點擊後退按鈕,這時候他其實會進入C頁面, 我們可以看以下流程圖

這時候我們在此點擊後退按鈕,就會到C頁面, 但是保存的路徑裡面`'/c' ` 已經被我刪除了, 所以判斷出來的是前進。

1、如果我們過濾重複的頁面路徑,是不是就會好了呢,其實也是一樣的


假如我們有5個頁面路徑,過濾了2個重複的,只有3個頁面路徑了


那麼我退到第四個路徑的時候是不是就找不到了, 那麼後面兩個頁面都會算是前進。


所以以目前來看,最好的辦法就是記錄每一個頁面,但是每個頁面,都讓他有區別


那麼我們就可以在url上面放一個隨機

字串

程式碼實作:


// 当没有key的时候会进入两次 beforeEach,我们只需保存带key的就行
const updateNavigations = (to) => {
 if (to.query[pathKey]) {
  store.commit('UPDATE_NAVIGATIONS', {path: to.fullPath})
 }
}

router.beforeEach((to, from, next) => {
 let toIndex = store.state.navigations.findIndex(path => path === to.fullPath)
 if (toIndex >= 0) { // 存在该路径
  let len = store.state.navigations.length-1
  if (toIndex === len) { // 当前路径是最后一条,证明是同一个页面
   console.log('refresh') 
  } else { // 后退
   store.commit('UPDATE_ROUTER_DIRECTION', { routerDirection: 'back' }) // 后退标志
   store.commit('DELETE_NAVIGATION', { index: toIndex }) // 删除当前路径后面的路径
  }
 }else{ // 不存在该路径
  store.commit('UPDATE_ROUTER_DIRECTION', { routerDirection: 'forward' }) // 前进标志
  updateNavigations(to) // 保存该连接
 }

 const query = { ...to.query }
 // 存在就直接next, 防止死循环
 if (!query['APP_KEY']) { // 不存在添加key ,再次 next
  query['APP_KEY'] = Math.random().toString(16).substring(2)
  next({ path: to.path, query})
 }else{
  next()
 }
})


##以上程式碼我們就能就url中加入一個APP_KEY 的隨機串,那樣就算同一個頁面在我們保存的路徑裡面也是其實是不同的。就可以正常的執行邏輯了


上面就基本解決了瀏覽器導航列的問題了

2. IOS上的滑動切換


在IOS的網頁上, 是可以左右滑動進行切換,即使你沒有做轉場動畫。


這個時候就會出現一個問題。

還是ABC頁面

A -> B -> C

當我們到達C頁面,然後向左滑動時,滑完他就進入B頁面,但這這時它還是會進入我們的beforeEach 這個鉤子函數裡面,執行我們上面的邏輯。


那樣就會觸發我們的轉場動畫。你會發現執行了兩次切換。

於是我在網路上找到了一個方法fix io​​s左滑再次執行動畫#2259

程式碼是這樣的

let touchEndTime = Date.now()

window.addEventListener('touchend', () => {
 touchEndTime = Date.now()
})

router.beforeEach((to, from, next) => {
 if ((Date.now() - touchEndTime) < 377) { // ios滑动切换
  store.commit(&#39;UPDATE_ROUTER_DIRECTION&#39;, { routerDirection: &#39;&#39; })
 }
})

上面也很好理解, 就是我們取到手指最後離開的屏幕的那一刻, 然後在到beforeEach裡面進行比較,
當手指離開屏幕的最後一刻跟我們自己beforeEach裡面進行的轉場相差小於337, 就算是IOS的滑動切換

那樣就解決了IOS的滑動切換問題了。

但是IOS的右滑切換時監聽不到手指離開螢幕的那一刻的(也不知道是什麼鬼), 所以IOS的右滑切換,是沒法像上面那樣判斷的。

這個我也沒找到解決方法, 暫時只能解決IOS左滑回傳的切換。

基本上遇到的比較麻煩的兩個點就是上面這兩個點了,其餘都是可以透過監聽事件進行設置,倒也沒什麼難度

線上DEMO示範

相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!

推薦讀取:

jQuery類別名稱選擇器(.class)使用方法詳解

vue動態綁定元件子父元件多表單驗證實作步驟詳解

以上是vue行動端路由切換案例解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python vs. JavaScript:性能和效率注意事項Python vs. JavaScript:性能和效率注意事項Apr 30, 2025 am 12:08 AM

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript的起源:探索其實施語言JavaScript的起源:探索其實施語言Apr 29, 2025 am 12:51 AM

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

幕後:什麼語言能力JavaScript?幕後:什麼語言能力JavaScript?Apr 28, 2025 am 12:01 AM

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來:趨勢和預測Python和JavaScript的未來:趨勢和預測Apr 27, 2025 am 12:21 AM

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python vs. JavaScript:開發環境和工具Python vs. JavaScript:開發環境和工具Apr 26, 2025 am 12:09 AM

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

JavaScript是用C編寫的嗎?檢查證據JavaScript是用C編寫的嗎?檢查證據Apr 25, 2025 am 12:15 AM

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript的角色:使網絡交互和動態JavaScript的角色:使網絡交互和動態Apr 24, 2025 am 12:12 AM

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。

C和JavaScript:連接解釋C和JavaScript:連接解釋Apr 23, 2025 am 12:07 AM

C 和JavaScript通過WebAssembly實現互操作性。 1)C 代碼編譯成WebAssembly模塊,引入到JavaScript環境中,增強計算能力。 2)在遊戲開發中,C 處理物理引擎和圖形渲染,JavaScript負責遊戲邏輯和用戶界面。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具