一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語言 - JavaScript - vue.js - vue移動端項目中如何實現(xiàn)頁面緩存的示例代碼

vue移動端項目中如何實現(xiàn)頁面緩存的示例代碼

2022-02-21 17:048號的凌晨4點 vue.js

這篇文章主要介紹了vue移動端項目中如何實現(xiàn)頁面緩存的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

背景

在移動端中,頁面跳轉(zhuǎn)之間的緩存是必備的一個需求。

例如:首頁=>列表頁=>詳情頁。

從首頁進入列表頁,列表頁需要刷新,而從詳情頁返回列表頁,列表頁則需要保持頁面緩存。

對于首頁,一般我們都會讓其一直保持緩存的狀態(tài)。

對于詳情頁,不管從哪個入口進入,都會讓其重新刷新。

實現(xiàn)思路

說到頁面緩存,在vue中那就不得不提keep-alive組件了,keep-alive提供了路由緩存功能,本文主要基于它和vuex來實現(xiàn)應(yīng)用里的頁面跳轉(zhuǎn)緩存。

vuex里維護一個數(shù)組cachePages,用以保存當前需要緩存的頁面。
keep-alive 的 includes 設(shè)置為cachePages。
路由meta添加自定義字段 needCachePages或keepAlive,needCachePages 為一個數(shù)組,表示該路由要進入的頁面如果在數(shù)組內(nèi),則緩存該路由,keepAlive則表示無論進入哪個頁面都保持緩存,如app首頁這種。
在路由守衛(wèi)beforeEach里判斷,如果要跳轉(zhuǎn)的路由頁面在當前路由的needCachePages里,則當前路由添加進cachePages里,反之刪除。

具體實現(xiàn)

vuex實現(xiàn)內(nèi)容

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// src/store/modules/app.js
 
export default {
 state: {
  // 頁面緩存數(shù)組
  cachePages: []
 },
 
 mutations: {
  // 添加緩存頁面
  ADD_CACHE_PAGE(state, page) {
   if (!state.cachePages.includes(page)) {
    state.cachePages.push(page)
   }
  },
  
  // 刪除緩存頁面
  REMOVE_CACHE_PAGE(state, page) {
   if (state.cachePages.includes(page)) {
    state.cachePages.splice(state.cachePages.indexOf(page), 1)
   }
  }
 }
}
?
1
2
3
4
5
6
// src/store/getters.js
 
const getters = {
 cachePages: state => state.app.cachePages
}
export default getters
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// src/store/index.js
 
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
 
import user from './modules/user'
import app from './modules/app'
import getters from './getters'
 
// 導(dǎo)出 store 對象
export default new Vuex.Store({
 getters,
 modules: {
  user,
  app
 }
})

App.vue里,keep-alive的include設(shè)置cachePages

?
1
2
3
4
5
6
7
8
9
<keep-alive :include="cachePages">
 <router-view :key="$route.fullPath"></router-view>
</keep-alive>
 
computed: {
 ...mapGetters([
  'cachePages'
 ])
}

路由配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
  path: '/home',
  name: 'Home',
  component: () => import('@/views/tabbar/Home'),
  meta: {
   title: '首頁',
   keepAlive: true
  }
},
{
  path: '/list',
  name: 'List',
  component: () => import('@/views/List'),
  meta: {
   title: '列表頁',
   needCachePages: ['ListDetail']
  }
},
{
  path: '/list-detail',
  name: 'ListDetail',
  component: () => import('@/views/Detail'),
  meta: {
   title: '詳情頁'
  }
}

路由守衛(wèi)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import Vue from 'vue'
import Router from 'vue-router'
import store from '@/store'
Vue.use(Router)
 
// 導(dǎo)入modules文件夾里的所有路由
const files = require.context('./modules', false, /\.js$/)
let modules = []
files.keys().forEach(key => {
 modules = modules.concat(files(key).default)
})
 
// 路由
const routes = [
 {
  path: '/',
  redirect: '/home',
 },
 ...modules
]
 
const router = new Router({
 mode: 'hash',
 routes: routes
})
 
 
function isKeepAlive(route) {
 if (route.meta && route.meta.keepAlive) {
  store.commit('ADD_CACHE_PAGE', route.name)
 }
 if (route.children) {
  route.children.forEach(child => {
   isKeepAlive(child)
  })
 }
}
 
routes.forEach(item => {
 isKeepAlive(item)
})
 
// 全局路由守衛(wèi)
router.beforeEach((to, from, next) => {
 if (from.meta.needCachePages && from.meta.needCachePages.includes(to.name)) {
  store.commit('ADD_CACHE_PAGE', from.name)
 } else if (from.meta.needCachePages) {
  store.commit('REMOVE_CACHE_PAGE', from.name)
 }
 // 出現(xiàn)頁面首次緩存失效的情況,猜測是vuex到keep-alive緩存有延遲的原因
 //這里使用延遲100毫秒解決
 setTimeout(() => {
  next()
 }, 100)
})
 
export default router

還原頁面滾動條位置

此時雖然頁面實現(xiàn)緩存了,但滾動條每次都會重新回到頂部。

對于緩存的頁面,會觸發(fā)activated和deactivated這兩個鉤子,可以利用這兩個鉤子來實現(xiàn)還原滾動條位置。

在頁面離開時,也就是deactivated觸發(fā)時記錄滾動條位置。

在重新回到頁面時,也就是activated觸發(fā)時還原滾動條位置。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 創(chuàng)建一個mixin
// src/mixins/index.js
 
export const savePosition = (scrollId = 'app') => {
 return {
  data() {
   return {
    myScrollTop: 0
   }
  },
  
  activated() {
   const target = document.getElementById(scrollId)
   target && target.scrollTop = this.myScrollTop
  },
  
  beforeRouteLeave(to, from, next) {
   const target = document.getElementById(scrollId)
   this.myScrollTop = target.scrollTop || 0
   next()
  }
 }
}

這里發(fā)現(xiàn)使用deactivated時會因為頁面隱藏過快會導(dǎo)致獲取的節(jié)點滾動條高度為0,所以用beforeRouteLeave。

在需要緩存的頁面中使用

?
1
2
3
4
5
6
7
<script>
import { savePosition } from '@/mixins'
 
export default {
 mixins: [new savePosition()]
}
</script>

如果頁面自定義了滾動容器,此時可以傳入滾動容器id

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<template>
  <div id="scroll-container" style="height: 100vh; overflow-y: scroll;">
 
  </div>
</template>
 
<script>
import { savePosition } from '@/mixins'
 
export default {
 mixins: [new savePosition('scroll-container')]
}
</script>

注意

我的小伙伴經(jīng)常會來問我一個問題,為什么我配置了卻沒有緩存的效果?

這個時候你就需要注意一個問題了,keep-alive的一個關(guān)鍵是路由里的name要和.vue文件里的name保持一致。

如果你的緩存沒有生效,請首先檢查一下兩個name和needCachePages里是否一致。

思考與不足

此方案是我一年多前的做法,現(xiàn)在想來其實還是存在一些不足的,比如每次都需要去配置路由里的needCachePages。

而實際上在移動端中,往往都是在返回上一頁時,上一頁始終保持緩存的狀態(tài),就如開發(fā)小程序時一樣,當我們調(diào)用navigateTo后再返回,頁面始終是緩存的并不需要任何人為的配置。

所以現(xiàn)在的想法是,在vue中提供一個全局的跳轉(zhuǎn)api,只要調(diào)用該api就把當前頁面緩存,如果需要刷新操作,可以像小程序里的onShow一樣在activated里執(zhí)行你的邏輯。

到此這篇關(guān)于vue移動端項目中如何實現(xiàn)頁面緩存的示例代碼的文章就介紹到這了,更多相關(guān)vue 頁面緩存內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://juejin.cn/post/6944962862410367006

延伸 · 閱讀

精彩推薦
  • vue.js梳理一下vue中的生命周期

    梳理一下vue中的生命周期

    看過很多人講vue的生命周期,但總是被繞的云里霧里,尤其是自學的同學,可能js的基礎(chǔ)也不是太牢固,聽起來更是吃力,那我就已個人之淺見,以大白話...

    CRMEB技術(shù)團隊7992021-12-22
  • vue.jsVue中引入svg圖標的兩種方式

    Vue中引入svg圖標的兩種方式

    這篇文章主要給大家介紹了關(guān)于Vue中引入svg圖標的兩種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的...

    十里不故夢10222021-12-31
  • vue.js用vite搭建vue3應(yīng)用的實現(xiàn)方法

    用vite搭建vue3應(yīng)用的實現(xiàn)方法

    這篇文章主要介紹了用vite搭建vue3應(yīng)用的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下...

    Asiter7912022-01-22
  • vue.jsVue多選列表組件深入詳解

    Vue多選列表組件深入詳解

    這篇文章主要介紹了Vue多選列表組件深入詳解,這個是vue的基本組件,有需要的同學可以研究下...

    yukiwu6752022-01-25
  • vue.jsVue項目中實現(xiàn)帶參跳轉(zhuǎn)功能

    Vue項目中實現(xiàn)帶參跳轉(zhuǎn)功能

    最近做了一個手機端系統(tǒng),其中遇到了父頁面需要攜帶參數(shù)跳轉(zhuǎn)至子頁面的問題,現(xiàn)已解決,下面分享一下實現(xiàn)過程,感興趣的朋友一起看看吧...

    YiluRen丶4302022-03-03
  • vue.jsVue2.x 項目性能優(yōu)化之代碼優(yōu)化的實現(xiàn)

    Vue2.x 項目性能優(yōu)化之代碼優(yōu)化的實現(xiàn)

    這篇文章主要介紹了Vue2.x 項目性能優(yōu)化之代碼優(yōu)化的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋...

    優(yōu)小U9632022-02-21
  • vue.jsVue2.x-使用防抖以及節(jié)流的示例

    Vue2.x-使用防抖以及節(jié)流的示例

    這篇文章主要介紹了Vue2.x-使用防抖以及節(jié)流的示例,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下...

    Kyara6372022-01-25
  • vue.js詳解vue 表單綁定與組件

    詳解vue 表單綁定與組件

    這篇文章主要介紹了vue 表單綁定與組件的相關(guān)資料,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下...

    Latteitcjz6432022-02-12
主站蜘蛛池模板: 明星裸乳照无奶罩 | 激情另类国内一区二区视频 | 人人爽人人草 | 亚洲精品久久久久久婷婷 | 精品国产福利一区二区在线 | 免费网站国产 | 日韩在线视频一区二区三区 | 国产一卡2卡3卡四卡高清 | 第一次破学生处破 | 国产美女久久久久 | 国产成人愉拍精品 | 日本噜噜影院 | 护士让我吃奶我扒她奶 | 精品免费视在线观看 | 美女大乳被捏羞羞漫画 | 国产不卡视频一区二区在线观看 | 草莓香蕉榴莲丝瓜秋葵绿巨人在线看 | 99re8在线精品视频免费播放 | 3d动漫美女被吸乳羞羞有 | 色五婷婷| 亚洲日本视频在线观看 | 国产123区在线视频观看 | 国产主播福利在线观看 | 日韩欧美精品 | 色中色软件 | 天天舔天天干天天操 | 久久免费黄色 | 爆操美女 | 久久国产精品二区99 | 99久久精品无码一区二区毛片 | 人与善交大片免费看 | 九九99香蕉在线视频美国毛片 | 国产一区二区三区在线观看视频 | 5x社区在线观看直接进入 | 亚洲29p | 免费网址视频在线看 | 狠狠插入 | 高黄h文各种play | 二次元美女脱裤子让男人桶爽 | 精品国产品香蕉在线观看 | 亚洲成年男人的天堂网 |