詳解小程序不同頁(yè)面之間通訊的解決方案
小程序做開(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í)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript 密碼強(qiáng)度驗(yàn)證規(guī)則、打分、驗(yàn)證(給出前端代碼,后端代碼可根據(jù)強(qiáng)度規(guī)則翻譯)
密碼強(qiáng)度是一個(gè)很普遍的功能,比較簡(jiǎn)單,主要是怎么制定這個(gè)強(qiáng)度規(guī)則。2010-05-05使用js實(shí)現(xiàn)單鏈解決前端隊(duì)列問(wèn)題的方法
這篇文章主要介紹了使用js實(shí)現(xiàn)單鏈解決前端隊(duì)列問(wèn)題的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02JavaScript實(shí)現(xiàn)跟隨廣告的示例代碼
浮動(dòng)廣告是目前網(wǎng)站很常見(jiàn)的一種廣告形式,浮動(dòng)廣告能實(shí)時(shí)跟隨用戶(hù)的瀏覽,有效的傳達(dá)產(chǎn)品要表達(dá)的意思,達(dá)到很好的傳播效果。本文使用JavaScript實(shí)現(xiàn)跟隨廣告的示例代碼,感興趣的可以了解一下2021-11-11JS實(shí)現(xiàn)淡藍(lán)色簡(jiǎn)潔豎向Tab點(diǎn)擊切換效果
這篇文章主要介紹了JS實(shí)現(xiàn)淡藍(lán)色簡(jiǎn)潔豎向Tab點(diǎn)擊切換效果,通過(guò)JavaScript相應(yīng)鼠標(biāo)事件實(shí)現(xiàn)非常簡(jiǎn)單的css樣式切換,簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-10-10詳解Webpack + ES6 最新環(huán)境搭建與配置
這篇文章主要介紹了詳解Webpack + ES6 最新環(huán)境搭建與配置,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06深入理解JavaScript系列(34):設(shè)計(jì)模式之命令模式詳解
這篇文章主要介紹了深入理解JavaScript系列(34):設(shè)計(jì)模式之命令模式詳解,命令模式(Command)的定義是:用于將一個(gè)請(qǐng)求封裝成一個(gè)對(duì)象,從而使你可用不同的請(qǐng)求對(duì)客戶(hù)進(jìn)行參數(shù)化,對(duì)請(qǐng)求排隊(duì)或者記錄請(qǐng)求日志,以及執(zhí)行可撤銷(xiāo)的操作,需要的朋友可以參考下2015-03-03js獲取窗口相對(duì)于屏幕左邊和上邊的位置坐標(biāo)
這篇文章主要介紹了js如何獲取窗口相對(duì)于屏幕左邊和上邊的位置,需要的朋友可以參考下2014-05-05javaScript 頁(yè)面自動(dòng)加載事件詳解
本篇文章主要是對(duì)javaScript頁(yè)面自動(dòng)加載事件進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-02-02