当前位置: 首页 > article >正文

微信小程序返回按钮监听实战:利用onShow实现数据刷新

1. 为什么需要监听返回按钮在微信小程序开发中我们经常会遇到这样的场景用户从页面A跳转到页面B然后点击左上角的返回按钮回到页面A。这时候如果页面A的数据发生了变化我们希望能够在返回时自动刷新数据。但是微信小程序并没有直接提供监听返回按钮事件的API这就需要我们寻找其他解决方案。我刚开始做小程序开发时也遇到过这个问题。当时做了一个日程管理应用用户可以在日程页面查看自己的日程安排点击某个日程可以进入详情页进行编辑。编辑完成后返回日程页时发现数据并没有更新必须手动下拉刷新才能看到最新数据。用户体验非常不好。后来研究发现返回按钮点击时虽然不会触发页面的onLoad生命周期函数但会触发onShow函数。这就是我们的突破口。通过合理利用onShow函数配合小程序的数据缓存机制就能实现返回时自动刷新数据的效果。2. 生命周期函数与返回按钮的关系2.1 小程序页面生命周期概述微信小程序的页面有一系列生命周期函数主要包括onLoad页面加载时触发一个页面只会调用一次onShow页面显示/切入前台时触发onReady页面初次渲染完成时触发onHide页面隐藏/切入后台时触发onUnload页面卸载时触发其中onShow和onHide是一对互补的生命周期函数。当页面从不可见到可见时会触发onShow反之则会触发onHide。2.2 返回按钮触发的生命周期当用户点击左上角的返回按钮时小程序会执行以下操作当前页面页面B会被销毁触发onUnload上一个页面页面A会重新显示触发onShow但不会触发页面A的onLoad因为页面A并没有重新加载这就是为什么我们需要在onShow中处理数据刷新而不是在onLoad中。很多新手开发者容易犯的错误就是把数据加载逻辑都写在onLoad中导致返回时数据无法更新。3. 实现方案详解3.1 基本思路要实现返回时刷新数据我们可以采用以下方案在页面B跳转目标页的onShow中设置一个标记在页面A源页面的onShow中检查这个标记如果标记存在则执行数据刷新并清除标记这样就能确保只有从页面B返回时才会刷新数据而其他情况下触发onShow比如小程序从后台切回前台不会误刷新。3.2 具体代码实现让我们用一个实际的例子来说明。假设我们有一个日程页面schedule和一个实验列表页面experiment从日程页可以跳转到实验列表页。实验列表页代码experiment.jsonShow: function() { // 设置一个标记表示是从这个页面返回的 wx.setStorageSync(fromExperiment, true) }日程页面代码schedule.jsonShow: function() { const fromExperiment wx.getStorageSync(fromExperiment) if (fromExperiment) { // 清除标记 wx.removeStorageSync(fromExperiment) // 刷新数据 this.loadData() } }, loadData: function() { // 这里写实际的数据加载逻辑 // 比如调用wx.request或者从本地缓存读取数据 // 然后调用this.setData更新页面 }3.3 代码解析当用户从日程页进入实验列表页时实验列表页的onShow会被触发设置一个标记当用户点击返回按钮时日程页的onShow会被触发日程页检查到有这个标记就知道是从实验列表页返回的于是执行数据刷新最后清除这个标记避免影响其他操作这种方案有几个优点实现简单不需要复杂的逻辑只会在特定情况下刷新数据不会造成不必要的网络请求不依赖小程序的内部实现稳定性好4. 进阶优化方案4.1 使用更精确的标记上面的基本方案虽然能用但有个小问题如果用户从其他页面也设置了同样的标记可能会导致误判。我们可以改进一下使用更精确的标记// 实验列表页 onShow: function() { wx.setStorageSync(lastPage, experiment) } // 日程页 onShow: function() { const lastPage wx.getStorageSync(lastPage) if (lastPage experiment) { wx.removeStorageSync(lastPage) this.loadData() } }这样就能更准确地判断是从哪个页面返回的。4.2 添加防抖机制如果页面有频繁的数据刷新需求可以考虑添加防抖机制避免短时间内多次刷新onShow: function() { const lastPage wx.getStorageSync(lastPage) if (lastPage experiment) { wx.removeStorageSync(lastPage) // 防抖处理500ms内只执行一次 if (!this.lastRefreshTime || Date.now() - this.lastRefreshTime 500) { this.loadData() this.lastRefreshTime Date.now() } } }4.3 结合页面栈管理对于更复杂的场景可以结合小程序的页面栈信息来判断是否需要刷新onShow: function() { const pages getCurrentPages() if (pages.length 1) { const prevPage pages[pages.length - 2] if (prevPage.route pages/experiment/experiment) { this.loadData() } } }这种方法不需要使用缓存直接通过页面路由信息判断更加精准。但要注意页面栈最多只能保存10个页面。5. 常见问题与解决方案5.1 onShow被多次触发的问题有开发者反馈onShow有时会被意外触发多次。这通常发生在以下情况小程序从后台切回前台使用wx.navigateTo跳转页面后又调用wx.navigateBack切换tab页时解决方案是在onShow中添加判断逻辑确保只在特定条件下执行刷新onShow: function() { // 只有从特定页面返回时才刷新 const fromPage wx.getStorageSync(fromPage) if (fromPage experiment) { wx.removeStorageSync(fromPage) this.loadData() } }5.2 数据同步问题如果多个页面都可能修改同一份数据需要考虑数据同步的问题。可以采用以下策略使用全局数据存储如redux或小程序自带的globalData在数据变更时发布事件通知在onShow中订阅这些事件及时更新数据5.3 性能优化频繁的数据刷新可能影响性能可以采取以下优化措施添加缓存机制只有数据确实变更时才刷新对于大数据量采用分页加载使用diff算法只更新变化的部分6. 实际应用案例让我们看一个更完整的例子实现一个待办事项列表待办列表页todo.jsPage({ data: { todos: [] }, onLoad: function() { this.loadData() }, onShow: function() { const fromEdit wx.getStorageSync(fromEditPage) if (fromEdit) { wx.removeStorageSync(fromEditPage) this.loadData() } }, loadData: function() { // 实际项目中这里可能是网络请求 const todos wx.getStorageSync(todos) || [] this.setData({ todos }) }, gotoEdit: function(e) { const id e.currentTarget.dataset.id wx.setStorageSync(fromEditPage, true) wx.navigateTo({ url: /pages/edit/edit?id${id} }) } })编辑页edit.jsPage({ data: { todo: {} }, onLoad: function(options) { const id options.id const todos wx.getStorageSync(todos) || [] const todo todos.find(item item.id id) || {} this.setData({ todo }) }, save: function() { const newTodo this.data.todo let todos wx.getStorageSync(todos) || [] todos todos.map(item item.id newTodo.id ? newTodo : item ) wx.setStorageSync(todos, todos) wx.navigateBack() } })这个例子展示了完整的流程从列表页跳转到编辑页时设置标记在编辑页修改数据后保存返回列表页时检测到标记自动刷新数据7. 最佳实践与注意事项在实际项目中我有以下几点经验分享标记命名要有意义使用能清晰表达用途的标记名如fromXXXPage避免使用a、b这样的简单名称及时清理标记一定要在用过标记后立即清除避免影响其他逻辑考虑异常情况比如用户可能直接杀掉小程序再进入这时候标记可能还留着需要有相应的处理性能监控在数据刷新时添加性能日志确保不会因为频繁刷新影响用户体验测试覆盖要测试各种场景包括正常返回从后台切回快速连续返回直接关闭小程序再打开用户提示如果数据刷新可能较慢应该给用户加载中的提示备选方案对于重要数据可以同时使用onShow刷新和定时刷新确保数据及时更新代码组织把数据刷新逻辑封装成独立函数方便维护和复用

相关文章:

微信小程序返回按钮监听实战:利用onShow实现数据刷新

1. 为什么需要监听返回按钮? 在微信小程序开发中,我们经常会遇到这样的场景:用户从页面A跳转到页面B,然后点击左上角的返回按钮回到页面A。这时候,如果页面A的数据发生了变化,我们希望能够在返回时自动刷新…...

知网研学Word插件引文样式切换指南:从国标到APA的实战技巧

1. 为什么需要切换引文样式? 写论文的朋友们应该都遇到过这样的烦恼:投国内期刊要用国标格式,投国际期刊又要求APA格式。每次切换投稿对象就得手动调整参考文献格式,光是调整标点符号和作者名顺序就能让人抓狂。我刚开始写论文时就…...

JavaScript调用ChineseOCR API实战:从图片上传到文字识别的完整流程

JavaScript调用ChineseOCR API实战:从图片上传到文字识别的完整流程 1. OCR技术概述与应用场景 光学字符识别(OCR)技术已经成为现代应用开发中不可或缺的一部分。这项技术能够将图片中的文字内容转换为可编辑、可搜索的文本数据,极…...

Android13 OTA升级中如何高效更新系统默认配置

1. Android13 OTA升级与系统默认配置的关系 每次Android系统OTA升级时,最让开发者头疼的问题之一就是如何确保新的系统默认配置能够正确生效。我在参与多个Android13设备升级项目时发现,很多团队会忽略系统默认设置的更新机制,导致用户升级后…...

AI如何赋能短剧产业?八点八数字AniShort平台给出协同创作新答案

随着AI技术尤其是AIGC的突破,数字内容生产正经历深刻变革。短剧,作为当下最火热的内容赛道之一,其工业化、智能化升级已成为必然趋势。近日,深耕数字人与智能体领域的八点八数字科技,正式发布了其面向短剧垂直领域的 A…...

高效智能的跨平台桌面待办任务管理神器

高效智能的跨平台桌面待办任务管理神器 【免费下载链接】My-TODOs A cross-platform desktop To-Do list. 跨平台桌面待办小工具 项目地址: https://gitcode.com/gh_mirrors/my/My-TODOs 在快节奏的数字化时代,如何高效管理日常任务成为每个现代人的必修课。…...

手把手教你用卡尔曼滤波实现电池温度实时监测(附Python代码)

手把手教你用卡尔曼滤波实现电池温度实时监测(附Python代码) 在电池管理系统中,温度监测的准确性直接关系到电池的安全性和使用寿命。传统方法如热电偶接触式测量存在响应延迟,而红外非接触式方案又受限于成本和安装条件。本文将聚…...

阴阳师智能挂机脚本:高效解放双手的游戏辅助工具

阴阳师智能挂机脚本:高效解放双手的游戏辅助工具 【免费下载链接】yysScript 阴阳师脚本 支持御魂副本 双开 项目地址: https://gitcode.com/gh_mirrors/yy/yysScript 阴阳师智能挂机脚本是一款专为阴阳师玩家设计的自动化工具,通过先进的图像识别…...

ArcGIS Runtime SDK实战:5分钟搞定3D场景图层加载(附完整代码)

ArcGIS Runtime SDK实战:5分钟搞定3D场景图层加载(附完整代码) 在数字孪生和智慧城市建设的浪潮中,3D地理可视化已成为GIS开发者的必备技能。本文将带您快速掌握ArcGIS Runtime SDK中3D场景图层的核心加载技术,从倾斜摄…...

ESP32 IDF 5.1.2 实战:从零构建BLE心率监测服务

1. 为什么选择ESP32构建BLE心率监测服务 如果你正在寻找一款性价比高、功耗低且支持蓝牙低功耗(BLE)的芯片来开发健康监测设备,ESP32绝对是首选。我自己做过好几个智能手环项目,实测下来ESP32的蓝牙性能非常稳定,搭配I…...

YOLOv8车辆跟踪避坑指南:BoT-SORT和ByteTrack算法选择与优化技巧

YOLOv8车辆跟踪避坑指南:BoT-SORT和ByteTrack算法选择与优化技巧 在智能交通和自动驾驶领域,车辆跟踪技术的精准度和实时性直接影响着整个系统的可靠性。YOLOv8作为当前最先进的目标检测框架之一,配合不同的跟踪算法可以展现出截然不同的性能…...

HLS DATAFLOW vs. PIPELINE vs. UNROLL:手把手教你根据Vitis HLS项目需求选对优化指令

HLS优化指令实战指南:DATAFLOW、PIPELINE与UNROLL的精准选择策略 1. 理解HLS优化指令的本质 在硬件加速设计领域,高层次综合(HLS)已经成为FPGA开发的重要工具。它允许开发者使用C/C等高级语言描述硬件行为,而无需深入掌…...

Metasploitable3安装避坑指南:解决Packer报错与VMware配置问题(实测有效)

Metasploitable3实战安装指南:从Pocker报错到VMware完美运行 如果你正在学习网络安全或渗透测试,Metasploitable3无疑是一个极佳的实战环境。这个故意设计存在漏洞的系统,能让你在一个安全的环境中练习各种攻击技术。然而,安装过…...

终极指南:如何用Legacy iOS Kit让旧iPhone满血复活

终极指南:如何用Legacy iOS Kit让旧iPhone满血复活 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit Legacy iO…...

PyCharm中TensorBoard报错?三步搞定环境变量配置(附常见路径查找技巧)

PyCharm中TensorBoard报错?三步搞定环境变量配置(附常见路径查找技巧) 当你在PyCharm中兴奋地准备启动TensorBoard来可视化训练过程时,却遭遇了"无法识别tensorboard"的错误提示,这种挫败感我深有体会。作为…...

【UDS诊断实战】——0x11服务:从协议解析到CDD配置的完整指南

1. 0x11服务基础:ECU重置的两种姿势 第一次接触UDS诊断协议时,我最困惑的就是这个0x11服务。明明都是重启ECU,为什么还要分硬重置和软重置?后来在实车测试中才明白,这就像我们电脑的"强制关机"和"正常重…...

STM32H7 SPI4 FLASH配置避坑指南:HAL库实战经验分享

STM32H7 SPI4 FLASH配置避坑指南:HAL库实战经验分享 在嵌入式开发中,SPI接口的FLASH存储器因其高速、低功耗和简单接口等优势,成为存储配置参数、日志数据和固件升级包的理想选择。STM32H7系列作为STMicroelectronics的高性能微控制器&#x…...

Qwen3.5-9B图文对话效果实测:细粒度物体识别+关系推理

Qwen3.5-9B图文对话效果实测:细粒度物体识别关系推理 1. 模型能力概览 Qwen3.5-9B作为新一代多模态大模型,在图文对话领域展现出显著优势。该模型通过创新的架构设计,实现了细粒度视觉理解和复杂关系推理能力的突破性提升。 1.1 核心增强特…...

深入解析iSLIP算法:指针滑动与迭代循环在交换机优先级匹配中的应用

1. iSLIP算法基础:从交换机瓶颈到高效匹配 想象一下早高峰的地铁站,如果所有乘客都挤在同一个闸机口排队,哪怕其他闸机空闲,整体通行效率也会大打折扣——这正是传统交换机面临的HOL(队头阻塞)问题。iSLIP算…...

JavaScript 数据类型全家福:谁是大哥大,谁是小透明?

有人说JS里万物皆对象,有人说JS里类型多得让人头大。今天我们就来盘点一下JavaScript的七种基本数据类型和它们的“爸爸”Object,看看它们各自有什么脾气,日常相处中又有哪些让人哭笑不得的坑。前言 JavaScript的数据类型,就像一大…...

燃气蒸汽锅炉的安全操作规程有哪些

开机前检查检查水位是否正常,严禁缺水启动。检查燃气压力、阀门、管路无泄漏、无异味。检查电源、控制柜、急停按钮正常。检查烟道通畅、无堵塞,风机、水泵无异响。检查压力表、安全阀、水位计完好有效。二、点火启动操作先开水泵,确认水位正…...

Qwen2.5-VL-7B-Instruct模型微调指南:领域适配实战

Qwen2.5-VL-7B-Instruct模型微调指南:领域适配实战 1. 引言 你是不是遇到过这样的情况:通用的大模型虽然强大,但在你的专业领域里总是差那么点意思?比如医疗影像分析时说不准专业术语,或者法律文档理解时抓不住关键要…...

Qwen3-32B-Chat在真实项目中的表现:某SaaS平台AI功能模块压测数据集

Qwen3-32B-Chat在真实项目中的表现:某SaaS平台AI功能模块压测数据集 1. 项目背景与测试环境 在当前的SaaS服务领域,AI功能模块已成为提升产品竞争力的关键要素。我们选择Qwen3-32B-Chat模型作为某SaaS平台智能客服模块的核心引擎,通过私有化…...

Qwen3.5-9B智能体开发:强化学习泛化能力在生产环境应用

Qwen3.5-9B智能体开发:强化学习泛化能力在生产环境应用 1. 项目概述与核心价值 Qwen3.5-9B作为新一代多模态大模型,在智能体开发领域展现出显著的性能提升。该模型基于unsolth框架构建,通过Gradio Web UI提供服务接口,默认运行在…...

【deepseek】PCIe 时钟架构介绍

PCIe 时钟架构介绍 PCIe (Peripheral Component Interconnect Express) 总线的高速数据传输依赖于精确且稳定的时钟系统。随着 PCIe 协议从 Gen 1 发展到 Gen 6/7,数据传输速率成倍增加,对时钟信号的质量、抖动和架构提出了更高的要求。 以下是关于 PCIe…...

Wan2.1 VAE效率提升:利用Dify平台快速构建AI图像生成工作流

Wan2.1 VAE效率提升:利用Dify平台快速构建AI图像生成工作流 最近在尝试把一些新的AI模型能力集成到实际应用里,Wan2.1 VAE就是其中一个让我眼前一亮的工具。它能在图像生成的后处理阶段,有效提升画面的清晰度和细节表现,让生成的…...

BGE-Large-Zh实际作品:向量示例+热力图+最佳匹配三视图完整呈现

BGE-Large-Zh实际作品:向量示例热力图最佳匹配三视图完整呈现 1. 工具概览:中文语义理解的视觉化利器 BGE-Large-Zh语义向量化工具是一个专门为中文文本理解设计的本地化工具,它能够将中文文字转换为机器可以理解的数字向量,并通…...

Swift-All低成本入门:从模型下载到微调部署,全程费用不到50元

Swift-All低成本入门:从模型下载到微调部署,全程费用不到50元 想玩转大模型,但一看到动辄需要几十GB显存的A100、H100,再看看云服务器按小时计费的价格,是不是瞬间觉得钱包一紧,梦想破灭?别急着…...

第6章:起飞!从零实现无人机“外部大脑”控制(PX4 Offboard 模式全解析)

你有没有想过,如何让无人机像提线木偶一样,被外部计算机精准操控?不是遥控器,而是一行行代码、一个个数据流,让无人机在天空中完成复杂任务?这就是 PX4 Offboard 控制 的魅力所在。今天,我们就来…...

安全加固你的InternLM2-Chat-1.8B服务:防范提示词注入与滥用

安全加固你的InternLM2-Chat-1.8B服务:防范提示词注入与滥用 最近有不少朋友在部署自己的AI对话服务,特别是像InternLM2-Chat-1.8B这样轻量又好用的模型。部署上线后,大家最关心的问题往往是:效果怎么样?速度快不快&a…...