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

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

 更新時(shí)間:2021年03月30日 08:35:18   作者:8號(hào)的凌晨4點(diǎn)  
這篇文章主要介紹了vue移動(dòng)端項(xiàng)目中如何實(shí)現(xiàn)頁面緩存的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

背景

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

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

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

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

對(duì)于詳情頁,不管從哪個(gè)入口進(jìn)入,都會(huì)讓其重新刷新。

實(shí)現(xiàn)思路

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

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

具體實(shí)現(xiàn)

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

// 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)
   }
  }
 }
}


// src/store/getters.js

const getters = {
 cachePages: state => state.app.cachePages
}
export default getters

// 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 對(duì)象
export default new Vuex.Store({
 getters,
 modules: {
  user,
  app
 }
})

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

<keep-alive :include="cachePages">
 <router-view :key="$route.fullPath"></router-view>
</keep-alive>

computed: {
 ...mapGetters([
  'cachePages'
 ])
}

路由配置

{
  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)

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)頁面首次緩存失效的情況,猜測(cè)是vuex到keep-alive緩存有延遲的原因
 //這里使用延遲100毫秒解決
 setTimeout(() => {
  next()
 }, 100)
})

export default router

還原頁面滾動(dòng)條位置

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

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

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

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

// 創(chuàng)建一個(gè)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時(shí)會(huì)因?yàn)轫撁骐[藏過快會(huì)導(dǎo)致獲取的節(jié)點(diǎn)滾動(dòng)條高度為0,所以用beforeRouteLeave。

在需要緩存的頁面中使用

<script>
import { savePosition } from '@/mixins'

export default {
 mixins: [new savePosition()]
}
</script>

如果頁面自定義了滾動(dòng)容器,此時(shí)可以傳入滾動(dòng)容器id

<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)常會(huì)來問我一個(gè)問題,為什么我配置了卻沒有緩存的效果?

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

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

思考與不足

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

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

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

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

相關(guān)文章

  • vue實(shí)現(xiàn)文章點(diǎn)贊和差評(píng)功能

    vue實(shí)現(xiàn)文章點(diǎn)贊和差評(píng)功能

    這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)文章點(diǎn)贊和差評(píng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue中組件傳值的常見方式小結(jié)

    vue中組件傳值的常見方式小結(jié)

    在 Vue.js 中,組件之間的數(shù)據(jù)傳遞是一個(gè)常見的需求,Vue 提供了多種方法來實(shí)現(xiàn)這一目標(biāo),包括 props、全局事件總線、消息的訂閱與發(fā)布等,下面我們就來學(xué)習(xí)一下這些方法的具體實(shí)現(xiàn)吧
    2023-12-12
  • 深入理解基于vue-cli的vuex配置

    深入理解基于vue-cli的vuex配置

    本篇文章主要介紹了基于vue-cli的vuex配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • vue項(xiàng)目中定時(shí)器無法清除的原因解決

    vue項(xiàng)目中定時(shí)器無法清除的原因解決

    頁面有定時(shí)器,并且定時(shí)器在離開頁面時(shí),有清除,本文主要介紹了vue項(xiàng)目中定時(shí)器無法清除的原因解決,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Vue?table新增、編輯解讀

    Vue?table新增、編輯解讀

    這篇文章主要介紹了Vue?table新增、編輯,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • vue或css動(dòng)畫實(shí)現(xiàn)列表向上無縫滾動(dòng)

    vue或css動(dòng)畫實(shí)現(xiàn)列表向上無縫滾動(dòng)

    這篇文章主要為大家詳細(xì)介紹了vue或css動(dòng)畫實(shí)現(xiàn)列表向上無縫滾動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue進(jìn)階之CodeMirror的應(yīng)用小結(jié)

    Vue進(jìn)階之CodeMirror的應(yīng)用小結(jié)

    CodeMirror支持在線編輯代碼,風(fēng)格包括js, java, php, c++等等100多種語言,下面這篇文章主要來和大家講講CodeMirror的應(yīng)用,感興趣的可以了解一下
    2023-06-06
  • vue兩個(gè)輸入框聯(lián)動(dòng)校驗(yàn)方式(最大值-最小值)

    vue兩個(gè)輸入框聯(lián)動(dòng)校驗(yàn)方式(最大值-最小值)

    這篇文章主要介紹了vue兩個(gè)輸入框聯(lián)動(dòng)校驗(yàn)方式(最大值-最小值),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Vue中父子組件如何實(shí)現(xiàn)傳值

    Vue中父子組件如何實(shí)現(xiàn)傳值

    這篇文章主要介紹了Vue中父子組件如何實(shí)現(xiàn)傳值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 詳解Vue-cli代理解決跨域問題

    詳解Vue-cli代理解決跨域問題

    本篇文章主要介紹了Vue-cli代理解決跨域問題,詳細(xì)的介紹了Vue如何設(shè)置代理,具有一定參考價(jià)值,有興趣的可以了解一下
    2017-09-09

最新評(píng)論