国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue 詳情跳轉至列表頁實現列表頁緩存

2019-11-19 11:56:10
字體:
來源:轉載
供稿:網友

甲爸爸提了一個需求,希望公眾號內的商城能夠像app一樣,從商品詳情頁跳轉至列表頁及其他列表頁時,可以實現列表頁緩存(數據不刷新、位置固定到之前點的商品的位置)

本來想著scrollBehavior應該可以滿足,但是實際操作中發現:如果列表帶著分頁,位置是不會定位到點擊的位置的

在網上轉了一圈,終于找到適合自己的方法――beforeRouteLeave

注:beforeRouteLeave只對一級頁面起作用,不適用于children中的其他二級或其他級別的頁面 

以上是準備工作,接下來 可以步入正題了:

找到入口掛載頁面:App.vue 在router-view外部包裹一個keep-alive的標簽

因為不是所有頁面都需要緩存,所以把需要緩存的頁面中加入name值,并將name值加入keep-alive中

<keep-alive v-if="isRouterAlive" include="starShop" >  <router-view></router-view></keep-alive>

當然,僅僅是這些,是不能實現緩存的,

剛開始我是學著網上的方法,這樣寫的,當從列表點入詳情頁時,就將 列表頁的keepalive值,賦為true (實現緩存)

beforeRouteLeave(to, from, next) {  if(from.path == '/sale/newGoods/index' && to.path == '/goods/detail') {    from.meta.keepAlive = true;    this.loading = true;    next();    return  } else {    from.meta.keepAlive = false;    window.location.reload();    this.$destroy();    next();    return  }},

但是后期甲爸爸發現一個bug: 當我從列表一點擊進入詳情之后,如果直接從詳情頁,點擊進入別的店鋪列表頁,即列表二,最新的列表頁內展示的商品列表是之前的數據,并沒有變為最新的店鋪列表內容 , 即列表二頁面展示的還是列表一的商品

玩大了,這個問題比較著急啊,萬一把顧客繞暈了,人家不買東西了,那我罪過不就大了咩

晚上趁著月黑風高、夜深人靜的時候,我苦思冥想,終于把這個社會毒瘤挖掉了

我絕不是屈居于甲爸爸的淫威之下,只是因為我對技術的執著,過度追求完美的我,忍受不聊我的東西出現這樣大的漏洞

要看解決辦法的直接來這    ↓↓↓↓↓↓

首先摒棄上面的列表頁面的方法

第一步:找到商品詳情頁,最為主角之一,我在這里用到了beforeRouteEnter、beforeRouteLeave

beforeRouteEnter (to, from, next) {  next(vm =>{    vm.formUrl = from.path;    console.log(vm.formUrl)  });},beforeRouteLeave(to, from, next) {  to.meta.keepAlive = false;  if(to.path == this.formUrl){    to.meta.keepAlive = true;    next();    return  }else{    to.meta.KeepAlive = false;    window.localStorage.removeItem('isRefresh')    this.$destroy();    next();    return  }},

beforeRouteEnter:進入路由之前執行的函數(拿到列表一的路由)

beforeRouteLeave:離開路由之前執行的函數(拿到列表二的路由)

通過這兩個鉤子,可以成功的拿到事件的另外兩位主角路由(列表一、列表二)

在詳情頁中,當離開該頁之前,在beforeRouteLeave內進行列表一、列表二的路由比較

若兩路由相同,則跳轉目的頁面(to.meta.keepAlive)值為true,列表頁面進行緩存(比如從詳情頁返回的時候)

若兩路由不同,則跳轉目的頁面發生了變化(比如從鞋帽列表――>鞋子商品――>鞋子列表),則鞋子列表頁面不需要緩存,需要刷新獲取最新的鞋子列表數據

第二步:處理事件的第二主角――列表頁面

這里我僅用到了beforeRouteEnter

這個鉤子中,我們可以拿到當前頁面的keepAlive值

這個值是在詳情頁中就已經給定的

如果是true,表示緩存,否則為不緩存(刷新)

防止頁面一直刷新,變成死亡函數,我們要在data中聲明一個變量isRefresh

isRefresh: window.localStorage.getItem('isRefresh') || true
beforeRouteEnter (to, from, next) {  next(vm =>{    if(to.meta.keepAlive != true && to.meta.keepAlive != null){      vm.goods=[];      window.localStorage.setItem('isRefresh',true)                            if(JSON.stringify(window.localStorage.getItem('isRefresh')) != false){                                  window.localStorage.setItem('isRefresh',false)        location.reload();      }      }  });  return},       

如果當前頁to.meta.keepAlive值不為true,且值存在,則需刷新頁面

防止頁面一直刷新,

window.localStorage.setItem('isRefresh',true)

設置緩存變量isRefresh,值為true(表示需要刷新)

當to.meta.keepAlive值不為true且isRefresh值為true,頁面刷新,且isRefresh賦值為false,即關閉刷新

vm.goods=[];是當頁面跳去新的列表頁刷新之前,會出現短暫的列表展示,為了避免不必要的誤導,在檢測到是跳轉到新的列表頁時,我將列表頁的goods列表情況,視覺感受會好一些

因項目不同而異,不需要可以去掉

多張頁面之間跳轉,判斷是否需要緩存或刷新獲取新數據,就是這樣了

或許因為業務需求不同,技術處理方式可能會不同,希望能幫助到各位,或者給各位一些啟發,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 昌黎县| 闽清县| 佛坪县| 大名县| 界首市| 明光市| 巨野县| 宿松县| 贵港市| 白水县| 常州市| 卫辉市| 全州县| 长垣县| 凤山市| 元朗区| 和田县| 沾化县| 厦门市| 定襄县| 绥化市| 凭祥市| 佛坪县| 贡山| 肥东县| 呈贡县| 临安市| 旌德县| 海盐县| 兖州市| 区。| 抚州市| 上犹县| 乐清市| 马公市| 开封县| 津市市| 龙江县| 扶风县| 项城市| 龙山县|