电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:2日期:2022-09-30 18:50:27
背景

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

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

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

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

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

實現思路

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

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

具體實現

vuex實現內容

// src/store/modules/app.jsexport default { state: { // 頁面緩存數組 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.jsconst getters = { cachePages: state => state.app.cachePages}export default getters

// src/store/index.jsimport Vue from ’vue’import Vuex from ’vuex’Vue.use(Vuex)import user from ’./modules/user’import app from ’./modules/app’import getters from ’./getters’// 導出 store 對象export default new Vuex.Store({ getters, modules: { user, app }})

App.vue里,keep-alive的include設置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: ’詳情頁’ }}

路由守衛

import Vue from ’vue’import Router from ’vue-router’import store from ’@/store’Vue.use(Router)// 導入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)})// 全局路由守衛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) } // 出現頁面首次緩存失效的情況,猜測是vuex到keep-alive緩存有延遲的原因 //這里使用延遲100毫秒解決 setTimeout(() => { next() }, 100)})export default router還原頁面滾動條位置

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

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

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

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

// 創建一個mixin// src/mixins/index.jsexport 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() } }}

這里發現使用deactivated時會因為頁面隱藏過快會導致獲取的節點滾動條高度為0,所以用beforeRouteLeave。

在需要緩存的頁面中使用

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

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

<template> <div style='height: 100vh; overflow-y: scroll;'> </div></template><script>import { savePosition } from ’@/mixins’export default { mixins: [new savePosition(’scroll-container’)]}</script>注意

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

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

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

思考與不足

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

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

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

到此這篇關于vue移動端項目中如何實現頁面緩存的示例代碼的文章就介紹到這了,更多相關vue 頁面緩存內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
主站蜘蛛池模板: 过滤器_自清洗过滤器_气体过滤器_苏州华凯过滤技术有限公司 | 春腾云财 - 为企业提供专业财税咨询、代理记账服务 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 工业风机_环保空调_冷风机_工厂车间厂房通风降温设备旺成服务平台 | 元拓建材集团官方网站 | 塑胶跑道施工-硅pu篮球场施工-塑胶网球场建造-丙烯酸球场材料厂家-奥茵 | 带压开孔_带压堵漏_带压封堵-菏泽金升管道工程有限公司 | 膜结构_ETFE膜结构_膜结构厂家_膜结构设计-深圳市烨兴智能空间技术有限公司 | 太空舱_民宿太空舱厂家_移动房屋太空舱价格-豪品建筑 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 交通信号灯生产厂家_红绿灯厂家_电子警察监控杆_标志杆厂家-沃霖电子科技 | 全国国际化学校_国际高中招生_一站式升学择校服务-国际学校网 | 实验室隔膜泵-无油防腐蚀隔膜泵-耐腐蚀隔膜真空泵-杭州景程仪器 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 必胜高考网_全国高考备考和志愿填报信息平台 | atcc网站,sigma试剂价格,肿瘤细胞现货,人结肠癌细胞株购买-南京科佰生物 | 标准件-非标紧固件-不锈钢螺栓-非标不锈钢螺丝-非标螺母厂家-三角牙锁紧自攻-南京宝宇标准件有限公司 | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 培训无忧网-教育培训咨询招生第三方平台 | 进口便携式天平,外校_十万分之一分析天平,奥豪斯工业台秤,V2000防水秤-重庆珂偌德科技有限公司(www.crdkj.com) | 肉嫩度仪-凝胶测试仪-国产质构仪-气味分析仪-上海保圣实业发展有限公司|总部 | 抖音短视频运营_企业网站建设_网络推广_全网自媒体营销-东莞市凌天信息科技有限公司 | 广州活动策划公司-15+年专业大型公关活动策划执行管理经验-睿阳广告 | 选矿设备,选矿生产线,选矿工艺,选矿技术-昆明昆重矿山机械 | 没斑啦-专业的祛斑美白嫩肤知识网站-去斑经验分享 | 网络推广公司_网络营销方案策划_企业网络推广外包平台-上海澜推网络 | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 电动打包机_气动打包机_钢带捆扎机_废纸打包机_手动捆扎机 | 深圳成考网-深圳成人高考报名网 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 西安展台设计搭建_西安活动策划公司_西安会议会场布置_西安展厅设计西安旭阳展览展示 | 宏源科技-房地产售楼系统|线上开盘系统|售楼管理系统|线上开盘软件 | 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 | 火锅加盟_四川成都火锅店加盟_中国火锅连锁品牌十强_朝天门火锅【官网】 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 视频教程导航网_视频教程之家_视频教程大全_最新视频教程分享发布平台 | 车间除尘设备,VOCs废气处理,工业涂装流水线,伸缩式喷漆房,自动喷砂房,沸石转轮浓缩吸附,机器人喷粉线-山东创杰智慧 | 净水器代理,净水器招商,净水器加盟-FineSky德国法兹全屋净水 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 搪玻璃冷凝器_厂家-越宏化工设备| 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 |