小程序不一樣頁面之間通信的解決方案

小程序作開發的時候不免須要不一樣頁面之間的通信,好比首頁打開新的頁面搜索獲取結果返回到首頁,不一樣tab頁面之間的數據交互等等。因而作了如下總結git

當前頁面打開新的頁面

打開新的頁面能夠經過 navigator 組件來實現,經過url傳參來實現,例如github

<navigator url="../search/search?id=123" open-type="redirect">搜索</navigator>

在新的頁面 onLoad 事件能夠拿到傳過來的參數 optionsnpm

onLoad: function(options) {
  console.log(options.id);
}

新的頁面回傳數據到當前頁面

在當前頁面定義一個方法小程序

searchRet(results) {
  console.log(results);
}

在搜索頁面獲取到的結果,因爲小程序頁面是經過棧來存儲的,因此能夠經過 getCurrentPages() 獲取獲取當前頁面棧的實例,第一個元素爲首頁,最後一個元素爲當前頁面微信

let pages = getCurrentPages();
let homePage = pages[pages.length - 2];
if (homePage) {
  homePage.searchRet(results);
}

生命週期和storage

經過 wx.setStorageSync() 方法能夠在本地存儲數據,在 page 的 onShow 回調裏獲取 storage 的值後作相應的處理,例如工具

// index.js
wx.setStorageSync('refresh', true);

// mycenter.js
if (wx.getStorageSync('refresh')) {
  // 作更新操做
  wx.removeStorageSync('refresh');
}

storage 也能夠用 globalData 來代替,原理同樣,這裏不作展開,兩種辦法均可行,可是就是太笨了,場景複雜起來無法搞 ?post

事件監聽

我的感受經過全局的事件監聽來處理是一個很好的方法,在 Page 頁面監聽事件,經過在另外一個 Page 觸發相應的事件,就能夠作對應的處理,實時高效,因而我封裝了一個能夠聲明命名空間的事件監聽器 nsevent ,能夠經過 npm 安裝到小程序(微信官方npm使用方法)ui

nsevent的用法也很簡單,只須要在監聽的頁面經過 nsevent.on() 來實現監聽,建議添加第三個參數命名空間,這樣能夠在 onUnload 回調解綁相應的事件,舉個如下例子url

// select.js
const nsevent = require('nsevent');
Page({
  onLoad() {
    nsevent.on('add', (num) => {
      console.log(`select.js接收到add事件,參數爲${num}`)
    }, 'select.js')
  },
  addnumber() {
    nsevent.emit('add', 1);
  },
  onUnload() {
    console.log('select.js移除add事件')
    nsevent.off('add', 'select.js');
  }
});

emit方法不只能夠觸發普通的事件,也能夠觸發指定命名空間的事件,好比 pageA 和 pageB,pageC 都監聽了 locationChange 事件,在 pageC 頁面想單獨觸發 pageA 的回調,能夠這樣寫 ?code

nsevent.emit('locationChange', { ns: ['pageA'] });

附上小程序代碼片斷,不知道這工具對你們有沒有用,若有有用請給個星星吧,或者有其餘好的意見能夠討論一下。

本文發佈於個人我的博客,https://www.kelen.cc/posts/5bf5802d4a11da65869b75bb

相關文章
相關標籤/搜索