溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信小程序頁面之間的通信如何實現(xiàn)

發(fā)布時間:2021-02-04 14:37:48 來源:億速云 閱讀:297 作者:小新 欄目:web開發(fā)

這篇文章主要介紹微信小程序頁面之間的通信如何實現(xiàn),文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

一個開始

小程序開發(fā)者總會碰到各種頁面之間的通信問題,實現(xiàn)方式也五花八門,比如...

場景還原

首先這是一個電商小程序。

有這樣一個需求:

  • 首頁某個地方要展示購物車商品數(shù)量。

  • 當我在其他頁面加購了商品,首頁數(shù)量刷新。

實現(xiàn)方式

方式一:onShow直接請求接口

Page({
 onShow() {
 // ...一些邏輯
 
 // 后端請求新的購物車數(shù)量
 this.requestCartNum();
 }
})

不足: 每次onShow都要請求接口,浪費資源。

方式二:globalData存儲購物車數(shù)量,onShow中做刷新  

// 主頁.js
Page({
 onShow() {
  // 在globalData獲取到購物車數(shù)據(jù)
  let num = globalData.cartNum;
  if (num !== this.data.cartNum) {
   this.setData({
    cartNum: num,
   });
  }
 }
});

// 加購頁.js
Page({
 // 加購后改變globalData的值
 cartAdd(num) {
  globalData.cartNum = globalData.cartNum + num;
 }
})

方式三:加購后獲取首頁實例,調(diào)用首頁方法

// 首頁.js
Page({
 onCartAdd(num) {
  this.setData({
   cartNum: this.data.cartNum + num,
  });
 },
});

// 加購頁.js
Page({
 onCartAdd(num) {
  // 加購后獲取到首頁的實例,調(diào)用首頁onCartAdd方法
  let pages = getCurrentPages();
  let curPage = pages[0];
  curPage.onCartAdd(num);
 }
})

不足:不確定能不能準確拿到首頁的實例,如果換做其他頁面就很難復用

方法四:事件訂閱與發(fā)布

// 首頁.js
Page({
 onLoad() {
  // 首頁監(jiān)聽事件
  this.$bus.on('cart_add', (num) => {
   this.setData({
    cartNum: this.data.cartNum + num,
   })
  })
 }
})

// 加購頁.js

Page({
 // 加購成功后觸發(fā)cart_add事件
 onCartAdd(num) {
  this.$bus.emit('cart_add', num);
 }
})

此方法用事件系統(tǒng),訂閱發(fā)布模式去做的處理。

以上幾種方法中最優(yōu)解決方案是方法四,利用事件的訂閱與發(fā)布,邏輯清晰兼容性好。但是都不可避免的不足是:每一個需要動態(tài)顯示購物數(shù)量的頁面都需要添加相同的邏輯代碼。

狀態(tài)管理方案

單頁應用中最常用的就是組件之間的通信,由此誕生了不同的狀態(tài)存儲方案: react用redux, vue用vuex。他們的思路都是類似的。都有一個核心 store 存儲著一切要管理的狀態(tài)。

那么,其他框架可以,小程序也可以。以redux為例,實現(xiàn)一套簡單的狀態(tài)管理方案。

wxdux的實現(xiàn)

使用前提:有redux基礎

wxdux 類似與redux,以action來描述觸發(fā)的行為,reducer來描述state的變化。

1. 小程序入口中注冊

注冊store并添加到globalData中去

import {createStore} from './wxdux/index';
import reducer from './reducer';

const store = createStore(reducer);

App({
 globalData: {
  store,
 },
});

2. reducer實現(xiàn)

寫法與redux類似,功能也類似。

const userReducer = (state = {}, action) => {
 // ...
}

const postReducer = (state = [], action) => {
 // ...
};

const reducers = {
 user: userReducer,
 posts: postReducer,
};

export default reducers;

3. 頁面中使用wxdux

connect方法會將小程序頁面實例與wxdux連接起來,必須提供$useState方法,該方法接收state,返回該頁面所需要的state

import {connect} from './wxdux/index';

Page(connect({
 data: {
  sex: '男',
 },
 onLoad() {
  // ...
 },
 $useState(state) {
  return {
   name: state.name,
  },
 },
}))

4. wxml中使用name

<view>{{name}}</view>

5. 觸發(fā)store更新

使用dispatch方法,該方法接收一個對象作為參數(shù),該對象必須包含type字段表示action的類型,wxdux會根據(jù)此action更新state并且刷新所有使用name的視圖

import {dispatch} from './wxdux/index';

Page(connect({
 // 某點擊事件觸發(fā),更新姓名為“張三”
 onClick() {
  const updateName = {
   type: 'update_name',
   name: '張三'
  };
  dispatch(updateName);
 }
}))

以上是“微信小程序頁面之間的通信如何實現(xiàn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI