vue2 设置keepAlive之后怎么刷新页面数据

场景:移动端有 A、B、C 三个页面,A、B 页面路由设置了keepAlive属性,有下面两个场景:

1、A 页面 --> B 页面,B 页面刷新。

2、C 页面 --> B页面,B 页面不刷新。

一、分为以下两个情况讨论:

情况一、B 页面的代码未做组件封装,B 页面的核心代码如下:

<template><div class="demo" ref="pageWrapRef"><div v-for="item in arr" :key="item.id">{{ item.name }}</div></div>
</template><script>
export default {name: 'demo',data() {return {name: 'zhangsan',id: '1',arr: [],pageSourceName: ''};},mounted() {for (let i = 0; i < 100; i++) {this.arr.push({id: i,name: `张三${i}`});}},beforeRouteEnter(to, from, next) {next((vm) => {vm.pageSourceName = from.name;});},activated() {if (this.pageSourceName == 'A') {// 处理刷新数据的逻辑this.resetParams();this.initData();} else {// 滚动到指定位置const scrollTop = sessionStorage.getItem('scrollTop');if (scrollTop) {this.$refs.pageWrapRef.scrollTop = scrollTop;}}},beforeRouteLeave(to, from, next) {if (to.name == 'A') {sessionStorage.removeItem('scrollTop');} else {sessionStorage.setItem('scrollTop', this.$refs.pageWrapRef.scrollTop);}next();},methods: {initData() {console.log('初始化页面的接口请求');},resetParams() {this.name = 'zhangsan';this.id = '1';console.log('由于页面数据缓存了 所以要把变量重置');}}
};
</script><style scoped>
.demo {padding: 0.16rem 0;height: calc(100vh - 0.8rem);overflow-y: scroll;background-color: #fff;
}
</style>

情况二、B 页面的代码做了组件封装,比如说将 B 页面中的模块拆分成更小的业务组件,每个业务组件单独处理业务逻辑。如下图:

当 B 页面嵌套好几层组件时,这时在处理刷新跨层组件的数据时,如果使用常规的传值,传方法,会有一定的难度。

经过对各种方案的实验,选择了这种方案,B 页面的顶层组件通过 provide 属性向外暴露数顶层组件的页面数据,页面内的业务子组件通过 inject 属性接收顶层组件的数据。

页面交互如下:

二、以下分为三个部分:页面路由配置、页面代码、组件代码,如下:

1、页面路由配置:

export default [{path: '/demo/demoA',name: 'demoA',meta: { keepAlive: true },component: () => import('@/page/demo/demoA')},{path: '/demo/demoB',name: 'demoB',meta: { keepAlive: true },component: () => import('@/page/demo/demoB')},{path: '/demo/demoC',name: 'demoC',component: () => import('@/page/demo/demoC')}
];

2、三个页面的代码:

A 页面:

<template><div class="demo-a" ref="pageWrapRef">demoA 页面<divclass="item"v-for="(item, index) in list":key="index"@click="handleJump(item)">{{ item.id }}--{{ item.name }}</div></div>
</template><script>
export default {name: 'demoA',data() {return {list: []};},activated() {const scrollTop = sessionStorage.getItem('scrollTopDemoA');if (scrollTop) {this.$refs.pageWrapRef.scrollTop = scrollTop;}},beforeRouteLeave(to, from, next) {sessionStorage.setItem('scrollTopDemoA', this.$refs.pageWrapRef.scrollTop);next();},mounted() {for (let i = 0; i < 100; i++) {this.list.push({id: `${i}`,name: `demoA`});}},methods: {handleJump(item) {this.$router.push({path: '/demo/demoB',query: {id: item.id}});}}
};
</script><style scoped>
.demo-a {background-color: #fff;height: 100vh;overflow-y: scroll;
}.item {height: 44px;line-height: 44px;border-bottom: 1px #eee solid;padding: 0 15px;
}.item:nth-child(odd) {background-color: paleturquoise;
}
</style>

B 页面

<template><div class="demo-a" ref="pageWrapRef">demoB 页面<demoGrandfather /></div>
</template><script>
import demoGrandfather from './demoGrandfather.vue';export default {name: 'demoB',provide() {return {demoB: this};},components: { demoGrandfather },data() {return {needRefresh: false};},activated() {const scrollTop = sessionStorage.getItem('scrollTopDemoB');if (scrollTop) {this.$refs.pageWrapRef.scrollTop = scrollTop;}},beforeRouteEnter(to, from, next) {if (to.name == 'demoB' && from.name == 'demoA') {next((vm) => {vm.needRefresh = true;});} else {next((vm) => {vm.needRefresh = false;});}next();},beforeRouteLeave(to, from, next) {if (to.name == 'demoA') {sessionStorage.removeItem('scrollTopDemoB');} else {sessionStorage.setItem('scrollTopDemoB',this.$refs.pageWrapRef.scrollTop);}next();},methods: {}
};
</script><style scoped>
.demo-a {background-color: #fff;height: 100vh;overflow-y: scroll;
}.item {height: 44px;line-height: 44px;border-bottom: 1px #eee solid;padding: 0 15px;
}.item:nth-child(odd) {background-color: paleturquoise;
}
</style>

C 页面

<template><div class="demo-c">demoC 页面</div>
</template><script>
export default {name: 'demoC'
};
</script><style scoped>
.demo-c {
}
</style>

3、B 页面中使用到的三个组件

顶层组件,demoGrandfather.vue 

<template><div class="demo-grandfather">grandfather page<DemoParent /></div>
</template><script>
import DemoParent from './demoParent.vue';export default {name: 'demoGrandfather',components: { DemoParent },data() {return {name: 'zhangsan',pageSourceName: ''};}
};
</script><style scoped>
.demo {padding: 0.16rem 0;height: calc(100vh - 0.8rem);overflow-y: scroll;background-color: #fff;
}
</style>

中间组件,demoParent.vue

<template><div class="demo-parent">parent page<DemoChildren /></div>
</template><script>
import DemoChildren from './demoChildren.vue';export default {name: 'demoParent',components: { DemoChildren },data() {return {name: 'zhangsan',id: '1',arr: [],pageSourceName: ''};},mounted() {for (let i = 0; i < 100; i++) {this.arr.push({id: i,name: `张三${i}`});}},methods: {initData() {console.log('初始化页面的接口请求');},resetParams() {this.name = 'zhangsan';this.id = '1';console.log('由于页面数据缓存了 所以要把变量重置');}}
};
</script><style scoped>
.demo {padding: 0.16rem 0;height: calc(100vh - 0.8rem);overflow-y: scroll;background-color: #fff;
}
</style>

底层组件,demoChildren.vue

<template><div class="demo-children"><!-- 隐藏域 --><div style="display: none;">{{ refresh }}</div><divclass="item"v-for="(item, index) in list":key="index"@click.stop="handleJump(item)">{{ item.id }} ----- {{ item.name }}</div></div>
</template><script>
export default {name: 'demoChildren',inject: ['demoB'],data() {return {list: [],id: '0',refreshExecuted: false // 是否已刷新,默认未刷新};},deactivated() {this.refreshExecuted = false; // 更新为未刷新状态},computed: {refresh() {if (this.demoB.needRefresh) {if (this.$route.name == 'demoB' && !this.refreshExecuted) {this.refreshExecuted = true;this.resetParams();this.initData();}}return this.demoB.needRefresh;}},methods: {initData() {console.log('初始化页面的接口请求');for (let i = 0; i < 100; i++) {this.list.push({id: `${i}`,name: `demoB`});}},resetParams() {console.log('由于页面数据缓存了 所以要把变量重置');},handleJump(item) {this.$router.push({path: '/demo/demoC',query: {id: item.id}});}}
};
</script><style scoped>
.demo-a {background-color: #fff;height: 100vh;overflow-y: scroll;
}.item {height: 44px;line-height: 44px;border-bottom: 1px #eee solid;padding: 0 15px;
}.item:nth-child(odd) {background-color: paleturquoise;
}
</style>

三、总结:

我们在接到一个需求时,往往只会针对当前的需求进行代码开发,很少有意识去进行开发前的规划工作,这就导致我们在前期开发的有多开心,后期在改动时就有多痛苦。而本次的分享也是基于最近工作中遇到的一个场景,这个问题的出现,让我逐渐意识到规划的重要性,规划就是凡事谋定而后动,前期规划的越多,后期在进行迭代时,限制条件就会越少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/501145.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能咖啡厅助手:人形机器人 +融合大模型,行为驱动的智能咖啡厅机器人(机器人大模型与具身智能挑战赛)

智能咖啡厅助手&#xff1a;人形机器人 融合大模型&#xff0c;行为驱动的智能咖啡厅机器人(机器人大模型与具身智能挑战赛) “机器人大模型与具身智能挑战赛”的参赛作品。的目标是结合前沿的大模型技术和具身智能技术&#xff0c;开发能在模拟的咖啡厅场景中承担服务员角色并…

136. 只出现一次的数字【简单】

136. 只出现一次的数字【简单】 题目描述&#xff1a; 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使…

TonePlayer音调播放器开发

音调播放器 根据蜂鸣器的声音频率、播放长短和声音大小&#xff0c;来产生设备需要的音频&#xff1a;比如设备启动声音、设备关机音、故障音、连接成功音、断开连接音、信号不稳定提示音、充电启动提示音、充电关闭提示音、设备插入提示音、设备拔出提示音、无操作提示音以及需…

Windows系统搭建VisualSVN并结合内网穿透实现远程访问本地服务

文章目录 前言1. VisualSVN安装与配置2. VisualSVN Server管理界面配置3. 安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4. 固定公网地址访问 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统…

Vue.js+SpringBoot开发音乐偏好度推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.1.1 音乐档案模块2.1.2 我的喜好模块2.1.3 每日推荐模块2.1.4 通知公告模块 2.2 用例图设计2.3 实体类设计2.4 数据库设计 三、系统展示3.1 登录注册3.2 音乐档案模块3.3 音乐每日推荐模块3.4 通知公告模…

C++ //练习 10.15 编写一个lambda,捕获它所在函数的int,并接受一个int参数。lambda应该返回捕获的int和int参数的和。

C Primer&#xff08;第5版&#xff09; 练习 10.15 练习 10.15 编写一个lambda&#xff0c;捕获它所在函数的int&#xff0c;并接受一个int参数。lambda应该返回捕获的int和int参数的和。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;v…

PID闭环控制算法的学习与简单使用

平台&#xff1a;matlab2021b&#xff0c;Vivado2018 应用场景和理解 一个早餐店&#xff0c;假如一天都有生意&#xff0c;生意有的时间很火爆&#xff0c;有时候又一般&#xff0c;老板又是个实在人&#xff0c;只知道在后厨蒸包子。由于包子蒸熟需要一定的时间&#xff0c;老…

vscode更新至1.86版本后,ssh远程连接服务器出现异常

问题 you are connected to an OS version that is unsupported by Visual Studio Code 你已连接到不受Visual Studio Code支持的OS 版本 原因是vscode更新到1.86版本后要求远程连接服务器的内核版本和库版本需要符合下面条件。 解决方法 因此有两种方法解决 1.更新服务器…

Transformer之Residuals Decoder

The Residuals 我们需要提到的编码器架构中的一个细节是&#xff0c;每个编码器中的每个子层(self-attention,&#xff0c;ffnn)周围都有一个残余连接&#xff0c;然后是 layer-normalization 步骤。 如果我们要可视化向量和与 self attention 相关的 layer-norm 运算&#x…

记一次dockerfile无法构建问题追溯

我有一个dockerfile如下&#xff1a; ENTRYPOINT ["/sbin/tini"&#xff0c;"-g", "--"] CMD /home/scrapy/start.sh 我原本的用意是先启动tini&#xff0c;再执行下面的cmd命令启动start.sh。 为啥要用tini&#xff1f; 因为我的这个docker…

C语言的数据存储详解

C语言数据存储 文章目录 C语言数据存储类型的基本归类类型的意义 数据在内存中的存储整形在内存中的存储大小端整形提升和截断 浮点型在内存中的存储浮点型的存储规则E的不同情况 运用 类型的基本归类 有无符号的意义&#xff1a;生活中有写数据是没有符号之分的&#xff0c;将…

线程安全的队列

学习一下别人写的&#xff0c;线程安全的队列代码。https://github.com/markparticle/WebServer/blob/master/code/log/blockqueue.hhttps://github.com/markparticle/WebServer/blob/master/code/log/blockqueue.h /** Author : mark* Date : 2020-06-16* copy…