欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue移動(dòng)端路由切換實(shí)例分析

 更新時(shí)間:2018年05月14日 08:53:11   作者:咚子  
本篇文章給大家分享了vue移動(dòng)端路由切換實(shí)例以及相關(guān)知識(shí)點(diǎn),對(duì)此有興趣的朋友可以參考學(xué)習(xí)下。

在寫移動(dòng)端時(shí),因?yàn)樾枰o頁(yè)面做轉(zhuǎn)場(chǎng)動(dòng)畫,便有了這次的研究

其中最主要的時(shí)以下兩個(gè)問(wèn)題:

瀏覽器導(dǎo)航欄的切換

IOS 上滑動(dòng)切換時(shí),會(huì)有兩次頁(yè)面的轉(zhuǎn)場(chǎng)動(dòng)畫,一次自身滑動(dòng)時(shí)進(jìn)行的切換,隨后觸發(fā)我們?cè)O(shè)置的轉(zhuǎn)場(chǎng)動(dòng)畫。

除了上面兩個(gè)問(wèn)題,其余的操作都是可以在頁(yè)面內(nèi)進(jìn)行設(shè)置,基本都是可控的。主要就是解決上面兩個(gè)問(wèn)題。

可以看下實(shí)際寫出來(lái)的效果:在線DEMO

1. 瀏覽器導(dǎo)航欄的切換

通過(guò)記錄 歷史記錄 來(lái)比較判斷前進(jìn)還是后退

如下例子

A頁(yè)面 -> B頁(yè)面 -> C頁(yè)面

假如我從 A頁(yè)面到 B頁(yè)面 再到C頁(yè)面,歷史記錄就會(huì)產(chǎn)生3條

我們用一個(gè)數(shù)組表示: ['/a', '/b', '/c']

然后我在通過(guò)點(diǎn)擊瀏覽器導(dǎo)航欄的后退按鈕, 我便會(huì)回到 B 頁(yè)面,

這時(shí)候我只要判斷是否存在 B頁(yè)面, 存在就證明我點(diǎn)的時(shí)后退按鈕。

然后只要我后退過(guò), 我就能點(diǎn)擊瀏覽器的前進(jìn)按鈕了。這時(shí)候怎么判斷它到底是前進(jìn)的呢。

我們可以這樣。

當(dāng)我們后退到了B頁(yè)面,歷史記錄不是還保存著['/a', '/b', '/c'] 三個(gè)路徑嗎

我們可以刪除B頁(yè)面后面的路徑,那現(xiàn)在就是 ['/a', '/b'];
如果我們后退到A頁(yè)面, 那么我們保存的路徑就是['/a']

只要我們點(diǎn)擊前進(jìn)按鈕, 我們?nèi)ケ4娴穆窂嚼锩嬲遥?是不是就找不到路徑了, 那樣就完成了前進(jìn)判斷。

上面是一種正常的情況。
但是假如我們有點(diǎn)頁(yè)面重復(fù)進(jìn)入了呢。

就如以下這種情況

A頁(yè)面 -> B頁(yè)面 -> C頁(yè)面 -> B頁(yè)面 -> C頁(yè)面

現(xiàn)在走了5步,到達(dá)了第二個(gè)C頁(yè)面, 然后我們后退一步,到達(dá)了B頁(yè)面

這個(gè)時(shí)候問(wèn)題就出來(lái)了,我們是刪除第一個(gè)B頁(yè)面后面的路徑還是刪除第二個(gè)B頁(yè)面后面的路徑

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

1、那這個(gè)時(shí)候我們按照上面正常情況的邏輯來(lái)操作.

我點(diǎn)擊前進(jìn), 然后我去保存的路徑里面找,找不到就算前進(jìn), 找到證明是后退。

那么結(jié)果顯而易見(jiàn),我們找到了第一個(gè)C頁(yè)面,那就這樣就算后退了,但其實(shí)我點(diǎn)擊的時(shí)前進(jìn)

2、那我們?cè)囍鴦h除第一個(gè)B頁(yè)面后面的路徑,那么保存的路徑就是: ['/a', '/b'],

那么我在點(diǎn)擊后退按鈕,這時(shí)候他其實(shí)會(huì)進(jìn)入C頁(yè)面, 我們可以看以下流程圖

這個(gè)時(shí)候我們?cè)诖它c(diǎn)擊后退按鈕,就會(huì)到C頁(yè)面, 但是保存的路徑里面 `'/c'` 已經(jīng)被我刪除了, 所以判斷出來(lái)的是前進(jìn)。

1、如果我們過(guò)濾重復(fù)的頁(yè)面路徑,是不是就會(huì)好了呢,其實(shí)也是一樣的

假如我們有5個(gè)頁(yè)面路徑,過(guò)濾了2個(gè)重復(fù)的,只有3個(gè)頁(yè)面路徑了

那么我退到第四個(gè)路徑的時(shí)候是不是就找不到了, 那么后面兩個(gè)頁(yè)面都會(huì)算作前進(jìn)。

所以以目前來(lái)看,最好的辦法就是記錄每一個(gè)頁(yè)面,但是每個(gè)頁(yè)面,都讓他有區(qū)別

那么我們就可以在url上面放一個(gè)隨機(jī)字符串

代碼實(shí)現(xiàn):

// 當(dāng)沒(méi)有key的時(shí)候會(huì)進(jìn)入兩次 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) { // 當(dāng)前路徑是最后一條,證明是同一個(gè)頁(yè)面
   console.log('refresh') 
  } else { // 后退
   store.commit('UPDATE_ROUTER_DIRECTION', { routerDirection: 'back' }) // 后退標(biāo)志
   store.commit('DELETE_NAVIGATION', { index: toIndex }) // 刪除當(dāng)前路徑后面的路徑
  }
 }else{ // 不存在該路徑
  store.commit('UPDATE_ROUTER_DIRECTION', { routerDirection: 'forward' }) // 前進(jìn)標(biāo)志
  updateNavigations(to) // 保存該連接
 }

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

以上代碼我們就能就url中添加一個(gè) APP_KEY 的隨機(jī)串,那樣就算同一個(gè)頁(yè)面在我們保存的路徑里面也是其實(shí)是不同的。就可以正常的執(zhí)行邏輯了

上面就基本解決了瀏覽器導(dǎo)航欄的問(wèn)題了

2. IOS上的滑動(dòng)切換

在IOS的網(wǎng)頁(yè)上, 是可以左右滑動(dòng)進(jìn)行切換,即使你沒(méi)有做轉(zhuǎn)場(chǎng)動(dòng)畫。

這個(gè)時(shí)候就會(huì)出現(xiàn)一個(gè)問(wèn)題。

還是ABC頁(yè)面

A -> B -> C

當(dāng)我們到達(dá)C頁(yè)面,然后向左滑動(dòng)時(shí),滑完他就進(jìn)入B頁(yè)面,但是這這時(shí)它還是會(huì)進(jìn)入我們的 beforeEach 這個(gè)鉤子函數(shù)里面,執(zhí)行我們上面的邏輯。

那樣就會(huì)觸發(fā)我們的轉(zhuǎn)場(chǎng)動(dòng)畫。你就會(huì)發(fā)現(xiàn)執(zhí)行了兩次切換。

于是我在網(wǎng)上找到了一種方法fix ios左滑再次執(zhí)行動(dòng)畫 #2259

代碼是這樣的

let touchEndTime = Date.now()

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

router.beforeEach((to, from, next) => {
 if ((Date.now() - touchEndTime) < 377) { // ios滑動(dòng)切換
  store.commit('UPDATE_ROUTER_DIRECTION', { routerDirection: '' })
 }
})

上面也很好理解, 就是我們?nèi)〉绞种缸詈箅x開(kāi)的屏幕的那一刻, 然后在到 beforeEach里面進(jìn)行比較,
當(dāng)手指離開(kāi)屏幕的最后一刻跟我們自己 beforeEach里面進(jìn)行的轉(zhuǎn)場(chǎng)相差小于 337, 就算是IOS的滑動(dòng)切換

那樣就解決了IOS的滑動(dòng)切換問(wèn)題了。

但是IOS的右滑切換時(shí)監(jiān)聽(tīng)不到手指離開(kāi)屏幕的那一刻的(也不知道是什么鬼), 所以IOS的右滑切換,是沒(méi)法像上面那樣判斷的。

這個(gè)我也沒(méi)找到解決辦法, 暫時(shí)只能解決IOS左滑返回的切換。

基本上遇到的比較麻煩的兩個(gè)點(diǎn)就是上面這兩個(gè)點(diǎn)了,其余都是可以通過(guò)監(jiān)聽(tīng)事件進(jìn)行設(shè)置,倒也沒(méi)什么難度

在線DEMO演示

github: DEMO源碼

相關(guān)文章

  • iview實(shí)現(xiàn)圖片上傳功能

    iview實(shí)現(xiàn)圖片上傳功能

    這篇文章主要為大家詳細(xì)介紹了iview實(shí)現(xiàn)圖片上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • uniapp 小程序和app map地圖上顯示多個(gè)酷炫動(dòng)態(tài)的標(biāo)點(diǎn)效果(頭像后端傳過(guò)來(lái))

    uniapp 小程序和app map地圖上顯示多個(gè)酷炫動(dòng)態(tài)的標(biāo)點(diǎn)效果(頭像后端傳過(guò)來(lái))

    這篇文章主要介紹了uniapp 小程序和app map地圖上顯示多個(gè)酷炫動(dòng)態(tài)的標(biāo)點(diǎn)效果(頭像后端傳過(guò)來(lái)),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • vue開(kāi)發(fā)公共組件之返回頂部

    vue開(kāi)發(fā)公共組件之返回頂部

    這篇文章主要為大家詳細(xì)介紹了vue開(kāi)發(fā)公共組件之返回頂部,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • VUE中的無(wú)限循環(huán)代碼解析

    VUE中的無(wú)限循環(huán)代碼解析

    本文通過(guò)實(shí)例代碼給大家介紹了vue中的無(wú)限循環(huán),代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-09-09
  • vue如何利用store實(shí)現(xiàn)兩個(gè)平行組件間的傳值

    vue如何利用store實(shí)現(xiàn)兩個(gè)平行組件間的傳值

    這篇文章主要介紹了vue如何利用store實(shí)現(xiàn)兩個(gè)平行組件間的傳值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue生命周期詳解

    Vue生命周期詳解

    這篇文章詳細(xì)介紹了Vue的生命周期,文中通過(guò)代碼示例介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Vue自定義指令的使用實(shí)例介紹

    Vue自定義指令的使用實(shí)例介紹

    作為使用Vue的開(kāi)發(fā)者,我們對(duì)Vue指令一定不陌生,諸如v-model、v-on、等,同時(shí)Vue也為開(kāi)發(fā)者提供了自定義指令的api,熟練的使用自定義指令可以極大的提高了我們編寫代碼的效率,讓我們可以節(jié)省時(shí)間開(kāi)心的摸魚(yú)
    2023-04-04
  • 利用vite創(chuàng)建vue3項(xiàng)目的全過(guò)程及一個(gè)小BUG詳解

    利用vite創(chuàng)建vue3項(xiàng)目的全過(guò)程及一個(gè)小BUG詳解

    Vite作為一個(gè)構(gòu)建工具,提供了一種快速的方法來(lái)構(gòu)建Vue應(yīng)用,而Vue3?則是一個(gè)前端框架,提供了強(qiáng)大的功能來(lái)構(gòu)建和管理前端項(xiàng)目,下面這篇文章主要給大家介紹了關(guān)于利用vite創(chuàng)建vue3項(xiàng)目的全過(guò)程及一個(gè)小BUG的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • VUE實(shí)時(shí)監(jiān)聽(tīng)元素距離頂部高度的操作

    VUE實(shí)時(shí)監(jiān)聽(tīng)元素距離頂部高度的操作

    這篇文章主要介紹了VUE實(shí)時(shí)監(jiān)聽(tīng)元素距離頂部高度的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07
  • Vue新的狀態(tài)管理庫(kù)Pinia入門教程

    Vue新的狀態(tài)管理庫(kù)Pinia入門教程

    Pinia不但支持Vue3,同時(shí)還支持Vue2,本文主要介紹了Vue新的狀態(tài)管理庫(kù)Pinia入門教程,具有一定的參考價(jià)值,感興趣的可以了解下
    2022-02-02

最新評(píng)論