微信小程序中,一个页面的数据改变了,怎么通知另一个页面也改变?

news2025/5/22 20:40:32

在微信小程序中,当一个页面的数据改变后通知另一个页面更新,可以通过以下步骤实现:

方法一:使用全局事件总线(推荐)

步骤说明:

  1. 在 app.js 中创建事件系统
    在全局 App 实例中实现事件监听和触发机制,用于跨页面通信。

// app.js
App({
  // 全局数据
  globalData: {},
  // 事件监听器集合
  _eventListeners: {},
  // 注册事件监听
  on(eventName, callback) {
    if (!this._eventListeners[eventName]) {
      this._eventListeners[eventName] = [];
    }
    this._eventListeners[eventName].push(callback);
  },
  // 移除事件监听
  off(eventName, callback) {
    const listeners = this._eventListeners[eventName];
    if (listeners) {
      this._eventListeners[eventName] = listeners.filter(cb => cb !== callback);
    }
  },
  // 触发事件
  emit(eventName, data) {
    const listeners = this._eventListeners[eventName];
    if (listeners) {
      listeners.forEach(cb => cb(data));
    }
  }
});

2.在数据改变的页面触发事件
当数据变化时,通过 emit 方法发送事件。

// 页面A(修改数据的页面)
const app = getApp();

// 数据更新后触发事件
app.emit('dataChanged', { key: 'newValue' });

3.在需要更新的页面监听事件
在目标页面的 onLoad 中注册监听,并在 onUnload 中移除监听,避免内存泄漏。

// 页面B(需要更新数据的页面)
const app = getApp();

Page({
  data: {
    localData: null
  },
  onLoad() {
    // 定义事件回调
    this.handleDataChanged = (res) => {
      this.setData({ localData: res.key });
    };
    // 注册监听
    app.on('dataChanged', this.handleDataChanged);
  },
  onUnload() {
    // 移除监听
    app.off('dataChanged', this.handleDataChanged);
  }
});

方法二:通过页面栈直接调用(慎用)

步骤说明:

  1. 获取目标页面实例
    使用 getCurrentPages() 获取页面栈,找到目标页面实例。

// 页面A(修改数据的页面)
const pages = getCurrentPages(); // 获取当前页面栈
const targetPage = pages.find(page => page.route === 'pages/B/B'); // 根据路由找到页面B实例

 2.直接更新目标页面数据
调用 setData 方法更新目标页面的数据。

if (targetPage) {
  targetPage.setData({ localData: 'newValue' });
}

注意事项:

  • 页面未加载时无效:如果目标页面未在页面栈中(如未打开或已被销毁),无法获取实例。

  • 维护困难:强依赖于页面路由路径,重构时容易出错。

方法三:使用全局数据配合生命周期

步骤说明:

  1. 在 app.js 中定义全局数据

// app.js
App({
  globalData: {
    sharedData: null
  }
});

 2.在页面A更新全局数据

// 页面A
const app = getApp();
app.globalData.sharedData = 'newValue';

3.在页面B的 onShow 中同步数据

// 页面B
const app = getApp();

Page({
  data: {
    localData: null
  },
  onShow() {
    this.setData({ localData: app.globalData.sharedData });
  }
});

缺点:

  • 实时性差:需依赖页面显示(onShow)触发更新。

  • 无法后台更新:如果页面B已在后台,不会自动刷新。

 

 

方法四:结合本地存储和事件监听

步骤说明:

  1. 数据变更时更新本地存储并触发事件

// 页面A
wx.setStorageSync('sharedKey', 'newValue'); // 存储数据
const app = getApp();
app.emit('dataStored', 'sharedKey'); // 触发事件

 2.在页面B监听事件并读取存储

// 页面B
const app = getApp();

Page({
  onLoad() {
    this.handleStorageChange = (key) => {
      const value = wx.getStorageSync(key);
      this.setData({ [key]: value });
    };
    app.on('dataStored', this.handleStorageChange);
  },
  onUnload() {
    app.off('dataStored', this.handleStorageChange);
  }
});

对比总结

方法实时性适用场景复杂度维护性
全局事件总线✅ 高任意页面间通信
直接调用页面实例✅ 高已知页面在栈中且路由明确
全局数据 + onShow❌ 低数据变化无需实时同步
本地存储 + 事件✅ 中需持久化且跨页面同步

推荐方案:

  • 优先使用全局事件总线:灵活解耦,适合大多数场景。

  • 慎用直接调用页面实例:仅限简单场景或已知页面状态。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL--day4--排序与分页

(以下内容全部来自上述课程) 1. 排序数据 1.1 排序基本使用 #1.排序 #如果没有使用排序操作,默认情况下查询返回的数据是按照添加数据的顺序显示的 SELECT * FROM employees;# 练习:按照salary从高到低的顺序显示员工信息 # 使用 ORDER …

系分论文《论软件系统安全分析和应用》

系统分析师论文范文系列 【摘要】 2023年3月,我司承接了某知名电商企业“智能化供应链管理系统”的开发任务,我作为系统分析师负责全面的安全分析与设计工作。该系统以提升电商供应链效率为核心,整合仓储、物流、支付等模块,并需应…

Mac安装redis

1、 去往网址 http://​编download.​编redis.io/releases/ 找到任意 结尾为* .tar.gz的文件下载下来 2、使用终端进入下载下来的redis文件 3、直接执行redis-server 如果出现redis标志性的图代表成功 如果显示command not found :redis-server 则在终端再进入src文件夹下&…

srs-7.0 支持obs推webrtc流

demo演示 官方教程: https://ossrs.net/lts/zh-cn/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP 实现原理就是通过WHIP协议来传输 SDP信息 1、运行 ./objs/srs -c conf/rtc.conf 2、obs推流 3、web端播放webrtc流 打开web:ht

Babylon.js学习之路《七、用户交互:鼠标点击、拖拽与射线检测》

文章目录 1. 引言:用户交互的核心作用1.1 材质与纹理的核心作用 2. 基础交互:鼠标与触摸事件2.1 绑定鼠标点击事件2.2 触摸事件适配 3. 射线检测(Ray Casting)3.1 射线检测的原理3.2 高级射线检测技巧 4. 拖拽物体的实现4.1 拖拽基…

星际争霸小程序:用Java实现策略模式的星际大战

在游戏开发的世界里,策略模式是一种非常实用的设计模式,它允许我们在运行时动态地选择算法或行为。今天,我将带你走进一场星际争霸的奇幻之旅,用Java实现一个简单的星际争霸小程序,通过策略模式来模拟不同种族单位的战…

Python数据可视化高级实战之一——绘制GE矩阵图

目录 一、课程概述 二、GE矩阵? 三、GE 矩阵图的适用范围 五、GE 矩阵的评估方法 (一)市场吸引力的评估要素 二、企业竞争实力的评估要素 三、评估方法与实践应用 1. 定量与定性结合法 2. 数据来源 六、GE矩阵的图形化实现 七、总结:GE 矩阵与 BCG 矩阵的对比分析 (一)GE…

StreamSaver实现大文件下载解决方案

StreamSaver实现大文件下载解决方案 web端 安装 StreamSaver.js npm install streamsaver # 或 yarn add streamsaver在 Vue 组件中导入 import streamSaver from "streamsaver"; // 确保导入名称正确完整代码修正 <!--* projectName: * desc: * author: dua…

CSS【详解】弹性布局 flex

适用场景 一维&#xff08;行或列&#xff09;布局 基本概念 包裹所有被布局元素的父元素为容器 所有被布局的元素为项目 项目的排列方向&#xff08;垂直/水平&#xff09;为主轴 与主轴垂直的方向交交叉轴 容器上启用 flex 布局 将容器的 display 样式设置为 flex 或 i…

自回归图像编辑 EditAR: Unified Conditional Generation with Autoregressive Models

Paperhttps://arxiv.org/pdf/2501.04699 Code (coming soon) 目录 方法 实验 EditAR是一个统一的自回归框架&#xff0c;用于各种条件图像生成任务——图像编辑、深度到图像、边缘到图像、分割到图像。 next-token预测的功效尚未被证明用于图像编辑。 EditAR主要构建在Ll…

React Flow 中 Minimap 与 Controls 组件使用指南:交互式小地图与视口控制定制(含代码示例)

本文为《React Agent&#xff1a;从零开始构建 AI 智能体》专栏系列文章。 专栏地址&#xff1a;https://blog.csdn.net/suiyingy/category_12933485.html。项目地址&#xff1a;https://gitee.com/fgai/react-agent&#xff08;含完整代码示​例与实战源&#xff09;。完整介绍…

STM32之串口通信WIFI上云

一、W模块的原理与应用 基本概念 如果打算让硬件设备可以通过云服务器进行通信&#xff08;数据上报/指令下发&#xff09;&#xff0c;像主流的云服务器有阿里云、腾讯云、华为云&#xff0c;以及其他物联网云平台&#xff1a;巴法云.......&#xff0c;硬件设备需要通过TCP…

PCB智能报价系统——————仙盟创梦IDE

软件署名 代码贡献&#xff1a; 紫金电子科技有限公司 文案正路&#xff1a;cybersnow 正文 对企业的竞争力有着深远影响。传统的 PCB 报价方式往往依赖人工核算&#xff0c;不仅耗时较长&#xff0c;还容易出现误差。随着科技的发展&#xff0c;PCB 自动报价系统应运而生&a…

LeetCode-链表-合并两个有序链表

LeetCode-链表-合并两个有序链表 ✏️ 关于专栏&#xff1a;专栏用于记录 prepare for the coding test。 文章目录 LeetCode-链表-合并两个有序链表&#x1f4dd; 合并两个有序链表&#x1f3af;题目描述&#x1f50d; 输入输出示例&#x1f9e9;题目提示&#x1f9ea;AC递归&…

sqli-labs靶场29-31关(http参数污染)

目录 前言 less29&#xff08;单引号http参数污染&#xff09; less30&#xff08;双引号http参数污染&#xff09; less31(双引号括号http参数污染) 前言 在JSP中&#xff0c;使用request.getParameter("id")获取请求参数时&#xff0c;如果存在多个同名参数&a…

JVM 垃圾回收机制深度解析(含图解)

JVM 垃圾回收机制深度解析&#xff08;含图解&#xff09; 一、垃圾回收整体流程 垃圾回收图解 #mermaid-svg-KPtxlwWntQx8TOj3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-KPtxlwWntQx8TOj3 .error-icon{fill…

如何利用 Conda 安装 Pytorch 教程 ?

如何利用 Conda 安装 Pytorch 教程 &#xff1f; 总共分为六步走&#xff1a; &#xff08;1&#xff09;第一步&#xff1a;验证conda 环境是否安装好&#xff1f; 1) conda -V2) conda --version&#xff08;2&#xff09;第二步&#xff1a;查看现有环境 conda env list…

uniapp vue 开发微信小程序 分包梳理经验总结

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“uniapp vue 开发微信小程序 分包梳理经验总结”。 在使用 UniAppvue框架开发微信小程序时&#xff0c;当项目比较大的时候&#xff0c;经常需要分包加载。它有助于控制主包的大小&#xff0c;从而提升小程序的启…

什么是VR展示?VR展示的用途

随着科技的迅猛发展&#xff0c;我们步入一个全新的数字时代。在这个时代&#xff0c;虚拟现实&#xff08;VR&#xff09;技术崭露头角&#xff0c;逐步改变我们对世界的认知。全景展示厅作为VR技术与传统展览艺术的完美结合&#xff0c;以独特的全景视角&#xff0c;引领我们…

.NET外挂系列:4. harmony 中补丁参数的有趣玩法(上)

一&#xff1a;背景 1. 讲故事 前面几篇我们说完了 harmony 的几个注入点&#xff0c;这篇我们聚焦注入点可接收的几类参数的解读&#xff0c;非常有意思&#xff0c;在.NET高级调试 视角下也是非常重要的&#xff0c;到底是哪些参数&#xff0c;用一张表格整理如下&#xff…