您好,登錄后才能下訂單哦!
這篇文章主要介紹在vue移動(dòng)端項(xiàng)目中怎么實(shí)現(xiàn)頁面緩存,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
在移動(dòng)端中,頁面跳轉(zhuǎn)之間的緩存是必備的一個(gè)需求。
例如:首頁=>列表頁=>詳情頁。
從首頁進(jìn)入列表頁,列表頁需要刷新,而從詳情頁返回列表頁,列表頁則需要保持頁面緩存。
對(duì)于首頁,一般我們都會(huì)讓其一直保持緩存的狀態(tài)。
對(duì)于詳情頁,不管從哪個(gè)入口進(jìn)入,都會(huì)讓其重新刷新。
說到頁面緩存,在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里,反之刪除。
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
此時(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" > </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里是否一致。
以上是“在vue移動(dòng)端項(xiàng)目中怎么實(shí)現(xiàn)頁面緩存”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。