微信小程序頁面間通信的實現方式

微信小程序中頁面間的通信是指不同頁面之間的數據傳遞、狀態同步或交互操作,常見于多頁面協作場景。根據通信方向和場景不同,主要有以下幾種實現方式:

一、基于頁面跳轉的參數傳遞

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
英文地址,請注明出處:http://en.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;比如…