麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 課堂 > 小程序 > 正文

如何讓微信小程序頁面之間的通信不再變困難

2020-03-21 15:54:36
字體:
來源:轉載
供稿:網友

一個開始

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

場景還原

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

有這樣一個需求:

  • 首頁某個地方要展示購物車商品數量。
  • 當我在其他頁面加購了商品,首頁數量刷新。

實現方式

方式一:onShow直接請求接口

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

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

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

// 主頁.jsPage({ onShow() {  // 在globalData獲取到購物車數據  let num = globalData.cartNum;  if (num !== this.data.cartNum) {   this.setData({    cartNum: num,   });  } }});// 加購頁.jsPage({ // 加購后改變globalData的值 cartAdd(num) {  globalData.cartNum = globalData.cartNum + num; }})

方式三:加購后獲取首頁實例,調用首頁方法

// 首頁.jsPage({ onCartAdd(num) {  this.setData({   cartNum: this.data.cartNum + num,  }); },});// 加購頁.jsPage({ onCartAdd(num) {  // 加購后獲取到首頁的實例,調用首頁onCartAdd方法  let pages = getCurrentPages();  let curPage = pages[0];  curPage.onCartAdd(num); }})

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

方法四:事件訂閱與發布

// 首頁.jsPage({ onLoad() {  // 首頁監聽事件  this.$bus.on('cart_add', (num) => {   this.setData({    cartNum: this.data.cartNum + num,   })  }) }})// 加購頁.jsPage({ // 加購成功后觸發cart_add事件 onCartAdd(num) {  this.$bus.emit('cart_add', num); }})

此方法用事件系統,訂閱發布模式去做的處理。

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

狀態管理方案

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

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

wxdux的實現

使用前提:有redux基礎

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

1. 小程序入口中注冊

注冊store并添加到globalData中去

import {createStore} from './wxdux/index';import reducer from './reducer';const store = createStore(reducer);App({ globalData: {  store, },});

2. reducer實現

寫法與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. 觸發store更新

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

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 免费国产自久久久久三四区久久 | 高清一区二区在线观看 | 久久精品亚洲一区二区三区观看模式 | 成年人黄色免费网站 | 黄色影院网站 | 欧美高清另类自拍视频在线看 | 娇喘视频在线观看 | 免费国产人成网站 | 成人综合一区二区 | 黄色大片在线免费观看 | 久久久久久久一区 | 国产黄色录像片 | 在线观看va | 性高湖久久久久久久久aaaaa | 久久久久久久久久久高潮一区二区 | 免费一级在线视频 | 国产视频第一区 | 久久艹综合| 成片免费大全 | 免费毛片电影 | 91亚洲免费视频 | 精品国产一区二区三区四区阿崩 | 免费啪视频在线观看 | 1级片在线观看 | 韩国三级日本三级香港三级黄 | 午夜在线视频一区二区三区 | 一级黄片毛片免费看 | 精品国产乱码一区二区三区四区 | 91性高湖久久久久久久久网站 | 久久久久久免费 | 狠狠干b | 视频一区二区国产 | 欧美成人一区二区三区电影 | 国产在线精品一区二区三区 | 一本色道久久综合亚洲精品图片 | 国产成人精品一区在线播放 | 杏美月av | av不卡毛片| 婷婷中文字幕一区二区三区 | 国产一区二区视频网站 | 在线看免电影网站 |