微信小程序页面间通信的实现方式

微信小程序中页面间的通信是指不同页面之间的数据传递、状态同步或交互操作,常见于多页面协作场景。根据通信方向和场景不同,主要有以下几种实现方式:

一、基于页面跳转的参数传递

1. 正向传递(A页面到B页面)

通过URL参数携带数据,在跳转时传递给目标页面,适用于简单数据的一次性传递。

// A页面跳转代码(声明式导航)
<navigator url="/pages/B/B?id=100&name=测试">跳转到B页面</navigator>// A页面跳转代码(编程式导航)
wx.navigateTo({url: '/pages/B/B?id=100&name=测试'
})// B页面接收参数(在onLoad生命周期中)
Page({onLoad(options) {console.log(options.id); // 100console.log(options.name); // 测试}
})

注意:参数值需避免特殊字符,若包含中文或特殊符号,建议使用encodeURIComponent编码后传递。

2. 反向传递(B页面到A页面)

从子页面返回父页面时,通过页面栈获取父页面实例,直接调用其方法传递数据。

// B页面返回并传递数据
Page({backToA() {// 获取当前页面栈const pages = getCurrentPages();// 上一页(A页面)实例const prevPage = pages[pages.length - 2];// 调用A页面的方法传递数据prevPage.receiveData('从B页面返回的数据');// 返回上一页wx.navigateBack();}
})// A页面定义接收数据的方法
Page({data: {dataFromB: ''},receiveData(data) {this.setData({dataFromB: data});}
})

适用于表单提交后刷新列表、选择器返回选择结果等场景。

二、全局数据共享机制

1. 全局变量(app.js)

在app.js中定义全局数据,所有页面通过getApp()访问,适合简单的全局状态共享。

// app.js中定义
App({globalData: {userInfo: null,theme: 'light'}
})// 页面中访问和修改
const app = getApp();
// 读取
console.log(app.globalData.theme);
// 修改
app.globalData.theme = 'dark';

缺点:数据变化时不会自动通知页面更新,需手动调用setData刷新视图。

2. 状态管理库(如mobx-miniprogram)

通过响应式状态管理库实现跨页面数据同步,适合中大型项目。

// 1. 定义store(store/index.js)
import { observable, action } from 'mobx-miniprogram';
export const store = observable({count: 0,updateCount: action(function(val) {this.count = val;})
});// 2. 页面A中修改状态
import { store } from '../../store';
store.updateCount(10);// 3. 页面B中监听状态变化
import { createStoreBindings } from 'mobx-miniprogram-bindings';
Page({onLoad() {this.bindings = createStoreBindings(this, {store,fields: ['count'],actions: ['updateCount']});},onUnload() {this.bindings.destroy();}
})

特点:数据变化时自动更新所有引用页面,实现真正的响应式通信。

三、本地缓存通信

利用小程序的本地缓存API(同步/异步)存储数据,实现跨页面共享,数据可持久化。

// 存储数据(页面A)
wx.setStorageSync('userToken', 'abc123');
wx.setStorage({key: 'userInfo',data: { name: '张三' },success() { console.log('存储成功') }
});// 读取数据(页面B)
const token = wx.getStorageSync('userToken');
wx.getStorage({key: 'userInfo',success(res) { console.log(res.data.name) } // 张三
});

适用场景:存储登录凭证、用户偏好设置等需长期保留的数据,注意缓存有大小限制(约10MB)。

四、事件总线(EventBus)

通过自定义事件总线实现任意页面间的通信,适合无直接跳转关系的页面。

// 1. 创建事件总线(utils/eventBus.js)
class EventBus {constructor() {this.events = {};}// 订阅事件on(name, callback) {if (!this.events[name]) this.events[name] = [];this.events[name].push(callback);}// 发布事件emit(name, data) {if (this.events[name]) {this.events[name].forEach(cb => cb(data));}}// 取消订阅off(name, callback) {if (this.events[name]) {this.events[name] = this.events[name].filter(cb => cb !== callback);}}
}
export default new EventBus();// 2. 页面A订阅事件
import eventBus from '../../utils/eventBus';
Page({onLoad() {this.handleMsg = (data) => {console.log('收到消息:', data);};eventBus.on('msgEvent', this.handleMsg);},onUnload() {eventBus.off('msgEvent', this.handleMsg); // 页面卸载时取消订阅}
})// 3. 页面B发布事件
import eventBus from '../../utils/eventBus';
Page({sendMsg() {eventBus.emit('msgEvent', '来自B页面的消息');}
})

优点:解耦性强,适合复杂页面结构的通信;需注意及时取消订阅避免内存泄漏。

五、各方式适用场景对比

URL参数传递:适合简单数据的正向跳转,如详情页ID传递。

页面栈反向传递:适合子页面返回父页面时传递结果,如选择器组件。

全局变量:适合简单的全局数据共享,如应用配置。

状态管理库:适合中大型项目的复杂状态同步,如购物车数据。

本地缓存:适合持久化数据存储,如登录状态、用户设置。

事件总线:适合无直接关联页面的通信,如跨模块通知。

实际开发中,可根据项目复杂度和具体场景选择合适的方式,复杂场景下可组合多种方式使用。

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

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

相关文章

uniapp开发微信小程序(新旧版本对比:授权手机号登录、授权头像和昵称)

目录标题授权手机号新旧版本核心差异对比强制使用新版的情况代码实现方案特殊处理逻辑企业账号要求最佳实践建议授权头像和昵称新旧版本核心差异对比强制使用新版的情况代码实现方案最佳实践建议注意事项授权手机号 新旧版本核心差异对比 触发方式 旧版&#xff08;2023年前&…

Java函数式编程之【Stream终止操作】【下】【三】【收集操作collect()与分组分区】【下游收集器】

分组收集器groupingBy()&#xff1a;groupingBy()收集器用于按条件对元素象进行分组&#xff0c;并将结果存储在Map实例中。其作用与数据库的SQL语句的group by的用法有异曲同工之妙。 分区收集器partitioningBy()&#xff1a;partitioningBy()可以看作是分组groupingBy()的特殊…

python设计模式-工厂模式

工厂模式的核心思想&#xff1a;封装对象创建过程、解耦对象使用与创建 。示例代码&#xff1a;from enum import Enum# 基类&#xff1a;人类 class Person:species Homo sapiensdef __init__(self, name):self.name namedef __str__(self):return f"{self.__class__._…

Rust:anyhow::Result 与其他 Result 类型转换

当函数返回的不是 anyhow::Result 而是其他 Result 类型时&#xff08;如 std::io::Result、serde_json::Result 或自定义 Result&#xff09;&#xff0c;可通过以下方法统一处理错误类型&#xff0c;确保与 anyhow 兼容或实现错误传播&#xff1a;&#x1f6e0;️ 一、错误类…

PLC-梯形图编程

1.位运算,比较 如&#xff1a;>,<,, 2.定时器 生成脉冲TP&#xff0c;常开触点闭合触发&#xff0c;赋值10秒时长&#xff0c;PT配置参数&#xff0c;ET运行时已PT计时 接通延时TON&#xff0c;常开触点闭合触发&#xff0c;延时10秒后赋值 关断延时TOF&#xff0c;常开触…

LLM学习笔记5——InstructGPT

系列文章目录 参考文献 参考文献 参考文献 参考视频 文章目录系列文章目录前言目前大模型不同的技术流派与框架路线&#xff1a;1. ​​BERT&#xff1a;Encoder-only架构​​​​1&#xff09; 架构特点​​​​2&#xff09; 训练目标​​3&#xff09; ​​​​应用场景2. …

热能小车cad【12张】三维图+设计说明书

摘要 无碳小车来自全国大学生工程能力训练大赛题目&#xff0c;根据“节能减排&#xff0c;绿色出行”的环保理念&#xff0c;提出了一种基于热力驱动的具有方向自动控制的无碳小车。 本文设计的无碳小车主要是将热能转化成机械能&#xff0c;用来驱动小车前进的装置&#xff0…

云原生 DevOps 实战之Jenkins+Gitee+Harbor+Kubernetes 构建自动化部署体系

技术背景​ 在云原生生态中&#xff0c;工具链的选择直接决定 CI/CD 流水线的效率与稳定性。本次方案的工具组合并非偶然&#xff0c;而是基于各组件的核心优势与生态适配性&#xff1a;​ 代码管理层&#xff1a;Gitee 作为国内主流的代码托管平台&#xff0c;支持 Git 分布…

二建机电工程专业都考哪些知识点?

二建机电工程专业需要考《建设工程施工管理》《建设工程法规及相关知识》和《机电工程管理与实务》三个科目。其中《机电工程管理与实务》是专业科目&#xff0c;也是考试重点&#xff0c;主要考查机电工程技术、机电工程相关法规与标准、机电工程项目管理实务等内容。具体如下…

React + ts + react-webcam + CamSplitter 实现虚拟摄像头解决win摄像头独占的问题

一、安装 CamSplitter 这块网上有很多教程了&#xff0c;这里不再赘述&#xff0c;就一点&#xff0c;需要分几个虚拟摄像头&#xff0c;就要在CamSplitter 的安装目录下 driver_install.cmd 执行几次。二、React ts react-webcam 调用虚拟摄像头import { useState, useEffec…

【深度学习①】 | Numpy数组篇

0 序言 本文为NumPy数组库的系统学习笔记&#xff0c;将自己先前的笔记做一个总结归纳。内容涵盖数组基础、创建、索引、变形、运算、函数、布尔型数组及与张量的衔接等内容。通过具体示例解析核心概念与操作&#xff0c;帮助读者掌握NumPy的使用逻辑与方法&#xff0c;为后续深…

5.实现 call

call 是 JavaScript 中非常核心的函数方法之一。它能改变函数的执行上下文&#xff08;也就是 this 的指向&#xff09;&#xff0c;在日常开发和面试中都极其常见。本文将带你一步步实现一个 Function.prototype.call 的自定义版本&#xff0c;真正理解它的底层原理。✨ 一、c…

Go语言中的盲点:竞态检测和互斥锁的错觉

&#x1f9e0; Go语言中的盲点&#xff1a;竞态检测和互斥锁的错觉 使用 -race 就能发现所有并发问题&#xff1f;加了 mutex 就万无一失&#xff1f; 这篇文章揭示了 Go 并发编程中的一个“危险盲区” —— 互斥锁并不能总能保护你免受数据竞争的影响&#xff0c;尤其是在 -ra…

从文件到文件描述符:理解程序与文件的交互本质

一、理解文件 抛一个概念&#xff1a; 文件 内容 属性。 1. 那么&#xff0c;空文件有大小吗&#xff1f;答案是有的。因为空文件指的是文件内容为空&#xff0c;文件属性也要占据大小啊。 将来对文件操作&#xff0c;无非分为两类&#xff1a; 1.对文件内容做修改。 2.对文件…

优化算法专栏——阅读导引

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

[ The Missing Semester of Your CS Education ] 学习笔记 Vim篇

“Writing English words and writing code are very different activities. When programming, you spend more time switching files, reading, navigating, and editing code compared to writing a long stream.” —— < The Missing Semester of Your CS Education &g…

Linux 系统中定时执行指定命令 crontab 定时任务配置

crontab 定时任务配置是 Linux/Unix 系统中用于自动、周期性执行指定命令或脚本的工具&#xff0c;相当于系统的 “定时闹钟”。它可以让系统在预设的时间&#xff08;如每天凌晨、每周一、每月 1 号等&#xff09;自动完成重复性工作&#xff0c;无需人工干预。自动化运维定期…

[ Leetcode ]---快乐数

题目链接 Leetcode快乐数 题目描述 如下图&#xff1a; 题目解析&#xff1a; 1.双指针法 算法核心思路 判断快乐数的关键挑战是如何检测是否进入无限循环。这里使用了快慢指针法&#xff08;Floyd 循环检测算法&#xff09;&#xff0c;这是一种高效检测循环的技巧&#…

智慧社区构建——2

1.实现Token校验## Token校验URLjson GET /checkToken 参数json HttpServletRequest request 返回json {"msg": "操作成功","code": 200,"status": "ok" }{"msg": "操作成功","code": 200,&q…

K-Means聚类:当数据没有标签时,如何让计算机自动“物以类聚”?

K-Means聚类&#xff1a;当数据没有标签时&#xff0c;如何让计算机自动“物以类聚”&#xff1f;&#x1f44b; 大家好&#xff0c;我是小瑞瑞&#xff01;欢迎回到我的专栏&#xff01; 在我们之前的旅程中&#xff0c;解决的问题大多都有一个明确的“目标”&#xff0c;比如…