小程序如何實現跨頁面通信

前言

最近有很多同學問,小程序里面如何進行跨頁面通信。看了下之前的老代碼,基本都是基于onShow或者localStorage。雖然可以實現,但是并不怎么優雅。

今天就來聊一聊,小程序的跨頁面通信的幾種實現方案。或許會有你想要的方案(優雅…)

方式一:onShow + localStorage

業務場景:頁面一未登錄跳轉至登錄頁面,登錄成功后返回頁面一,頁面一需要更新當前登錄態

<!-- 頁面一 -->
<template><view><text>{{ name }}</text><view class="login_text">當前是否登錄:<text>{{ isLogin ? '是' : '否' }}</text></view><button @tap="gotoLogin">跳轉登錄</button></view>
</template><script setup lang="ts">
import { ref } from 'vue'
import taro, { useDidShow } from '@tarojs/taro'
const name = ref('前端南玖---小程序頁面通信')
const loginStatus = taro.getStorageSync('isLogin') || false
const isLogin = ref<boolean>(loginStatus)const gotoLogin = () => {taro.navigateTo({url: '/pages/login/index'})
}
// 小程序onshow生命周期,從localStorage獲取是否登錄,更新頁面
useDidShow(() => {const loginStatus = taro.getStorageSync('isLogin') || falseisLogin.value = loginStatus
})
</script>
<!--登錄頁-->
<template><view>登錄頁面<button @tap="login">登錄</button></view>
</template><script setup lang="ts">
import taro from '@tarojs/taro'
const login = () => {taro.login({success: function (res) {console.log('登錄成功', res)taro.setStorageSync('isLogin', true)taro.navigateBack()},fail: function (res) {console.log('登錄失敗', res)}})
}
</script>

在這里插入圖片描述

優點: 這種方案可能是最簡單的通信方案,比較容易理解

缺點: 如果完成通信后,沒有即時清除通信數據,可能會出現問題。另外因為依賴localStorage,而localStorage可能出現讀寫失敗,從面造成通信失敗

方式二:onShow + globalData

業務場景同上

這個方案與第一個方案差不多,只不過是將localStorage換成了globalData

Taro框架想要使用小程序的globalData需要使用Taro提供的插件 setGlobalDataPlugin

// app.ts
import { setGlobalDataPlugin } from '@tarojs/taro'const App = createApp({
})// 注冊全局數據
App.use(setGlobalDataPlugin, {isLogin: false, // 是否登錄
})
// 頁面一
// ...import { ref } from 'vue'
import taro, { useDidShow } from '@tarojs/taro'
const app = taro.getApp()
const name = ref('前端南玖---小程序頁面通信')
const loginStatus = taro.getStorageSync('isLogin') || false
const isLogin = ref<boolean>(loginStatus)const gotoLogin = () => {taro.navigateTo({url: '/pages/login/index'})
}// 使用globalData
useDidShow(() => {// const loginStatus = taro.getStorageSync('isLogin') || falseconsole.log('app.globalData', app.isLogin)const loginStatus = app.isLogin || falseisLogin.value = loginStatus
})
// 登錄頁
import taro from '@tarojs/taro'
const app = taro.getApp()
const login = () => {taro.login({success: function (res) {console.log('登錄成功', res)app.isLogin = truetaro.navigateBack()},fail: function (res) {console.log('登錄失敗', res)}})
}

在這里插入圖片描述

優點: 實現簡單,容易理解。因為不用讀寫localStorage,直接操作內存,所以相比方式1,速度更快,更可靠

缺點: 同方式1一樣,要注意globalData污染

方式三:eventBus發布訂閱

我們還可以通過實現一個中央事件總線,通過發布訂閱實現跨頁面通信。

// eventBus
export default class EventBus {private static instance: EventBusprivate listeners: Record<string, Function[]>private constructor() {this.listeners = {}}public static getInstance() {if (!EventBus.instance) {EventBus.instance = new EventBus()}return EventBus.instance}public on(event: string, callback: Function) {if (!this.listeners[event]) {this.listeners[event] = []}this.listeners[event].push(callback)}public off(event: string, callback: Function) {if (!this.listeners[event]) {return}const index = this.listeners[event].findIndex((listener) => listener === callback)if (index !== -1) {this.listeners[event].splice(index, 1)}}public emit(event: string, ...args: any[]) {if (!this.listeners[event]) {return}this.listeners[event].forEach((listener) => listener(...args))}
}
// app.ts
import EventBus from './utils/eventBus'
// 注冊全局事件總線
App.config.globalProperties.$bus = EventBus.getInstance()
// 頁面一
import { onMounted, ref, getCurrentInstance } from 'vue'
import taro, { useDidShow } from '@tarojs/taro'
const $bus = getCurrentInstance()?.appContext.config.globalProperties.$busonMounted(() => {// 訂閱登錄狀態isLogin.value = $bus.on('loginStatus', (status: boolean) => {console.log('$bus', status)isLogin.value = status})
})
// 登錄頁
import taro from '@tarojs/taro'
import { getCurrentInstance } from 'vue'
const $bus = getCurrentInstance()?.appContext.config.globalProperties.$bus
const login = () => {taro.login({success: function (res) {console.log('登錄成功', res)// 發布登錄狀態$bus.emit('loginStatus', true)taro.navigateBack()},fail: function (res) {console.log('登錄失敗', res)}})
}

在這里插入圖片描述

這種方式看著是比前兩種優雅了不少,但缺點是需要維護發布的事件,避免重復綁定。

方式四:Taro.eventCenter(taro提供的發布訂閱)

Taro 提供了 Taro.Events 來實現消息機制,同時 Taro 還提供了一個全局消息中心 Taro.eventCenter 以供使用,它是 Taro.Events 的實例

import Taro, { Events } from '@tarojs/taro'const events = new Events()// 監聽一個事件,接受參數
events.on('eventName', (arg) => {// doSth
})// 監聽同個事件,同時綁定多個 handler
events.on('eventName', handler1)
events.on('eventName', handler2)
events.on('eventName', handler3)// 觸發一個事件,傳參
events.trigger('eventName', arg)// 觸發事件,傳入多個參數
events.trigger('eventName', arg1, arg2, ...)// 取消監聽一個事件
events.off('eventName')// 取消監聽一個事件某個 handler
events.off('eventName', handler1)// 取消監聽所有事件
events.off()
// 頁面一
onMounted(() => {// 訂閱登錄狀態taro.eventCenter.on('loginStatusTaro', (status: boolean) => {console.log('eventCenter', status)isLogin.value = status})
})
// 登錄頁
const login = () => {taro.login({success: function (res) {console.log('登錄成功', res)// 向首頁發送數據// eventChannel.emit('acceptDataFromLoginPage', { data: res.code, loginStatus: true })// 觸發事件,傳遞參數taro.eventCenter.trigger('loginStatusTaro', true)// 發布登錄狀態// $bus.emit('loginStatus', true)taro.navigateBack()},fail: function (res) {console.log('登錄失敗', res)}})
}

方式五:小程序的EventChannel

頁面間事件通信通道

  • EventChannel.emit(string eventName, any args):觸發一個事件

  • EventChannel.on(string eventName, function fn):持續監聽一個事件

  • EventChannel.once(string eventName, function fn):監聽一個事件一次,觸發后失效

  • EventChannel.off(string eventName, function fn):取消監聽一個事件。給出第二個參數時,只取消給出的監聽函數,否則取消所有監聽函數

EventChannel借助wx.navigateTo方法,在兩個頁面之間構建起了數據通道,互相可以通過“派發事件”及“注冊這些事件的監聽器”來實現基于事件的頁面通信。

// 頁面一const gotoLogin = () => {taro.navigateTo({url: '/pages/login/index',events: {// 為指定事件添加一個監聽器,獲取被打開頁面傳送到當前頁面的數據acceptDataFromLoginPage: function(data) {console.log('來自登錄頁的數據', data)isLogin.value = data.loginStatus},},success: function(res) {// 通過eventChannel向被打開頁面傳送數據res.eventChannel.emit('acceptDataFromIndexPage', { data: 'nanjiu from index' })}})
}
// 登錄頁
import taro, { getCurrentPages } from '@tarojs/taro'
const current = getCurrentPages().pop()
const eventChannel = current?.getOpenerEventChannel()
eventChannel.on('acceptDataFromIndexPage', function(data) {console.log('來自首頁的數據', data)
})
const login = () => {taro.login({success: function (res) {console.log('登錄成功', res)eventChannel.emit('acceptDataFromLoginPage', { data: res.code, loginStatus: true })taro.navigateBack()},fail: function (res) {console.log('登錄失敗', res)}})
}

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71773.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71773.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71773.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【工具】win-畫圖 保留圖片信息并僅改變圖片比例的工具

Windows 系統自帶的“畫圖”工具 Windows 系統自帶的“畫圖”&#xff08;Paint&#xff09;工具可以進行簡單的圖片編輯&#xff0c;包括調整圖片大小和比例。 使用方法&#xff1a; 打開“畫圖”工具&#xff08;可以通過在開始菜單中搜索“畫圖”或“Paint”&#xff09;。…

如何編輯autodl中以.bashrc結尾的隱藏文件

在nnunet的運行過程中遇到了設置環境變量的問題。之前沒有接觸過linux系統&#xff0c;但是autodl里面默認是linux系統。.bashrc 是一個在 Bash shell 啟動時執行的腳本文件&#xff0c;常用于設置環境變量、定義別名、加載函數等&#xff0c;用戶可以通過編輯這個文件來定制自…

實驗3 知識表示與推理

實驗3 知識表示與推理 一、實驗目的 &#xff08;1&#xff09;掌握知識和知識表示的基本概念&#xff0c;理解其在AI中的深刻含義與意義&#xff1b; &#xff08;2&#xff09;熟悉AI中常用的知識表示方法的優缺點及其應用場景&#xff1b; &#xff08;3&#xff09;掌握產…

在 M1 Mac 上解鎖 TensorFlow GPU 加速:從環境搭建到實戰驗證

在 M1 Mac 上解鎖 TensorFlow GPU 加速&#xff1a;從環境搭建到實戰驗證 前言&#xff1a;蘋果芯片的深度學習新紀元 隨著 Apple Silicon 芯片的普及&#xff0c;M1/M2/M3 系列 Mac 已成為移動端深度學習開發的新選擇。本文將以 TensorFlow 2.x 為例&#xff0c;手把手教你如…

Python 數據分析概述 ①

一文讀懂Python數據分析&#xff1a;從基礎到實踐全攻略 在當今數字化浪潮中&#xff0c;數據分析已然成為解鎖海量數據價值的關鍵鑰匙&#xff0c;而Python憑借其獨特優勢&#xff0c;在數據分析領域大放異彩。今天&#xff0c;咱們就結合教學PPT內容&#xff0c;深入探索Pyt…

【Gin-Web】Bluebell社區項目梳理6:限流策略-漏桶與令牌桶

本文目錄 一、限流二、漏桶三、令牌桶算法四、Gin框架中實現令牌桶限流 一、限流 限流又稱為流量控制&#xff0c;也就是流控&#xff0c;通常是指限制到達系統的并發請求數。 限流雖然會影響部分用戶的使用體驗&#xff0c;但是能一定程度上保證系統的穩定性&#xff0c;不至…

Linux高并發服務器開發 第十九天(線程 進程)

目錄 1.進程組和會話 2.守護進程 2.1守護進程daemon概念 2.2創建守護進程 3.線程 3.1線程的概念 3.2線程內核三級映射 3.3線程共享 3.4線程優缺點 4.線程控制原語 4.1獲取線程id 4.2創建線程 4.3循環創建N個子線 4.4子線程傳參地址&#xff0c;錯誤示例 4.5線程…

軟件工程和系統分析與設計

軟件工程 1、軟件危機 2、軟件過程模型 2.1 瀑布模型 2.2原型模型 2.3螺旋模型 2.4敏捷模型 2.5軟件統一過程 3、軟件能力成熟度模型 CMM 4、軟件能力成熟度模型集成 CMMI 系統分析與設計 1、結構化方法SASD 1.1結構化分析 DFD 1.2結構化設計 SD-是一種面向數據流的設計…

Qt/C++面試【速通筆記一】

Qt 信號與槽機制 什么是信號&#xff08;Signal&#xff09;和槽&#xff08;Slot&#xff09;&#xff1f; 在Qt中&#xff0c;信號&#xff08;Signal&#xff09;和槽&#xff08;Slot&#xff09;是實現對象之間通信的一種機制。信號是對象在某些事件發生時發出的通知&…

LangChain大模型應用開發:構建Agent智能體

介紹 大家好&#xff0c;博主又來給大家分享知識了。今天要給大家分享的內容是使用LangChain進行大模型應用開發中的構建Agent智能體。 在LangChain中&#xff0c;Agent智能體是一種能夠根據輸入的任務或問題&#xff0c;動態地決定使用哪些工具(如搜索引擎、數據庫查詢等)來…

微服務架構概述及創建父子項目

目錄 一&#xff0c;什么是單體架構 二&#xff0c;什么是集群和分布式架構 三&#xff0c;什么是微服務架構 四&#xff0c;解決微服務難題的方案Spring-cloud Spring Cloud Alibaba是阿里巴實現的方案&#xff0c;基于SpringCloud的規范。如果說Spring Cloud Netflix 是…

C/C++跳動的愛心

系列文章 序號直達鏈接1C/C李峋同款跳動的愛心2C/C跳動的愛心3C/C經典愛心4C/C滿屏飄字5C/C大雪紛飛6C/C炫酷煙花7C/C黑客帝國同款字母雨8C/C櫻花樹9C/C奧特曼10C/C精美圣誕樹11C/C俄羅斯方塊小游戲12C/C貪吃蛇小游戲13C/C孤單又燦爛的神14C/C閃爍的愛心15C/C哆啦A夢16C/C簡單…

量子計算的威脅,以及企業可以采取的措施

當谷歌、IBM、Honeywell和微軟等科技巨頭紛紛投身量子計算領域時&#xff0c;一場技術軍備競賽已然拉開帷幕。 量子計算雖能為全球數字經濟帶來巨大價值&#xff0c;但也有可能對相互關聯的系統、設備和數據造成損害。這一潛在影響在全球網絡安全領域引起了強烈關注。也正因如…

Unity制作游戲——前期準備:Unity2023和VS2022下載和安裝配置——附安裝包

1.Unity2023的下載和安裝配置 &#xff08;1&#xff09;Unity官網下載地址&#xff08;國際如果進不去&#xff0c;進國內的官網&#xff0c;下面以國內官網流程為例子&#xff09; unity中國官網&#xff1a;Unity中國官網 - 實時內容開發平臺 | 3D、2D、VR & AR可視化 …

23貪心算法

分發餅干 class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {int i0,j0;int count0;sort(s.begin(),s.end());sort(g.begin(),g.end());while(i<g.size()&&j<s.size()){if(g[i]<s[j]){i;j;count;}else…

Spark 和 Flink

Spark 和 Flink 都是目前流行的大數據處理引擎&#xff0c;但它們在架構設計、應用場景、性能和生態方面有較大區別。以下是詳細對比&#xff1a; 1. 架構與核心概念 方面Apache SparkApache Flink計算模型微批&#xff08;Micro-Batch&#xff09;為主&#xff0c;但支持結構…

Android 串口通信

引言 在iot項目中&#xff0c;Android 端總會有和硬件通信。 通信這里&#xff1a;串口通信&#xff0c;藍牙通信或者局域網通信。 這里講一下串口通信。 什么是串口&#xff1f; “串口”&#xff08;Serial Port&#xff09;通常是指一種用于與外部設備進行串行通信的接口。…

【計算機網絡】OSI模型、TCP/IP模型、路由器、集線器、交換機

一、計算機網絡分層結構 計算機網絡分層結構 指將計算機網絡的功能劃分為多個層次&#xff0c;每個層次都有其特定的功能和協議&#xff0c;并且層次之間通過接口進行通信。 分層設計的優勢&#xff1a; 模塊化&#xff1a;各層獨立發展&#xff08;如IPv4→IPv6&#xff0c…

從人機環境系統智能角度看傳統IP的全球化二次創作法則

從人機環境系統智能的視角看&#xff0c;傳統IP的全球化二次創作法則需結合技術、文化、倫理與環境的復雜協同。這一過程不僅是內容的本土化改編&#xff0c;更是人、機器與環境在動態交互中實現價值共創的體現。 一、人機環境系統智能的底層邏輯與IP二次創作的融合 1、感知層&…

實現 INFINI Console 與 GitHub 的單點登錄集成:一站式身份驗證解決方案

本文將為您詳細解析如何通過 GitHub OAuth 2.0 協議&#xff0c;為 INFINI Console 實現高效、安全的單點登錄&#xff08;Single Sign-On, SSO&#xff09;集成。通過此方案&#xff0c;用戶可直接使用 GitHub 賬戶無縫登錄 INFINI Console&#xff0c;簡化身份驗證流程&#…