溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

詳解小程序不同頁(yè)面之間通訊的解決方案

發(fā)布時(shí)間:2020-10-06 19:12:27 來(lái)源:腳本之家 閱讀:151 作者:kelen 欄目:web開(kāi)發(fā)

小程序做開(kāi)發(fā)的時(shí)候難免需要不同頁(yè)面之間的通訊,比如首頁(yè)打開(kāi)新的頁(yè)面搜索獲取結(jié)果返回到首頁(yè),不同tab頁(yè)面之間的數(shù)據(jù)交互等等。于是做了以下總結(jié)

當(dāng)前頁(yè)面打開(kāi)新的頁(yè)面

打開(kāi)新的頁(yè)面可以通過(guò) navigator 組件來(lái)實(shí)現(xiàn),通過(guò)url傳參來(lái)實(shí)現(xiàn),例如

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

在新的頁(yè)面 onLoad 事件可以拿到傳過(guò)來(lái)的參數(shù) options

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

新的頁(yè)面回傳數(shù)據(jù)到當(dāng)前頁(yè)面

在當(dāng)前頁(yè)面定義一個(gè)方法

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

在搜索頁(yè)面獲取到的結(jié)果,由于小程序頁(yè)面是通過(guò)棧來(lái)存儲(chǔ)的,所以可以通過(guò) getCurrentPages() 獲取獲取當(dāng)前頁(yè)面棧的實(shí)例,第一個(gè)元素為首頁(yè),最后一個(gè)元素為當(dāng)前頁(yè)面

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

生命周期和storage

通過(guò) wx.setStorageSync() 方法可以在本地存儲(chǔ)數(shù)據(jù),在 page 的 onShow 回調(diào)里獲取 storage 的值后做相應(yīng)的處理,例如

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

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

storage 也可以用 globalData 來(lái)代替,原理一樣,這里不做展開(kāi),兩種辦法都可行,但是就是太笨了,場(chǎng)景復(fù)雜起來(lái)沒(méi)法搞 😫

事件監(jiān)聽(tīng)

個(gè)人感覺(jué)通過(guò)全局的事件監(jiān)聽(tīng)來(lái)處理是一個(gè)很好的方法,在 Page 頁(yè)面監(jiān)聽(tīng)事件,通過(guò)在另一個(gè) Page 觸發(fā)相應(yīng)的事件,就可以做對(duì)應(yīng)的處理,實(shí)時(shí)高效,于是我封裝了一個(gè)可以聲明命名空間的事件監(jiān)聽(tīng)器 nsevent ,可以通過(guò) npm 安裝到小程序(微信官方npm使用方法)

nsevent的用法也很簡(jiǎn)單,只需要在監(jiān)聽(tīng)的頁(yè)面通過(guò) nsevent.on() 來(lái)實(shí)現(xiàn)監(jiān)聽(tīng),建議添加第三個(gè)參數(shù)命名空間,這樣可以在 onUnload 回調(diào)解綁相應(yīng)的事件,舉個(gè)以下例子

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

emit方法不僅可以觸發(fā)普通的事件,也可以觸發(fā)指定命名空間的事件,比如 pageA 和 pageB,pageC 都監(jiān)聽(tīng)了 locationChange 事件,在 pageC 頁(yè)面想單獨(dú)觸發(fā) pageA 的回調(diào),可以這樣寫(xiě) 😀

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

附上小程序代碼片段,以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

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

AI