小程序作開發的時候不免須要不一樣頁面之間的通信,好比首頁打開新的頁面搜索獲取結果返回到首頁,不一樣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); }
經過 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