這篇文章主要介紹了微信小程序跨頁(yè)面數(shù)據(jù)傳遞事件響應(yīng)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
在實(shí)際工作中有很多場(chǎng)景需要在第二個(gè)頁(yè)面中將用戶操作之后的將數(shù)據(jù)回傳到上一頁(yè)面。愛掏網(wǎng) - it200.com接下來(lái)將我的方案分享給小伙伴。愛掏網(wǎng) - it200.com 本次示例采用 uni-app 框架和 weui 樣式庫(kù) 實(shí)現(xiàn)思路 創(chuàng)建一個(gè) Emitter,用于事件處理 創(chuàng)建一個(gè) ...
在實(shí)際工作中有很多場(chǎng)景需要在第二個(gè)頁(yè)面中將用戶操作之后的將數(shù)據(jù)回傳到上一頁(yè)面。愛掏網(wǎng) - it200.com接下來(lái)將我的方案分享給小伙伴。愛掏網(wǎng) - it200.com
本次示例采用 uni-app 框架和 weui 樣式庫(kù)
實(shí)現(xiàn)思路
- 創(chuàng)建一個(gè) Emitter,用于事件處理
- 創(chuàng)建一個(gè)全局的 Storage
- 在第一個(gè)頁(yè)面創(chuàng)建一個(gè) emitter 對(duì)象,并添加事件監(jiān)聽,將 emitter 存儲(chǔ)到 Storage 中
- 在第二個(gè)頁(yè)面從 Storage 中取出 emitter 對(duì)象, 并觸發(fā)事件,將數(shù)據(jù)傳遞到第一個(gè)頁(yè)面中做處理
創(chuàng)建 Emitter
function isFunc(fn) { return typeof fn === 'function'; } export default class Emitter { constructor() { this._store = {}; } /** * 事件監(jiān)聽 * @param {String} event 事件名 * @param {Function} listener 事件回調(diào)函數(shù) */ on(event, listener) { const listeners = this._store[event] || (this._store[event] = []); listeners.push(listener); } /** * 取消事件監(jiān)聽 * @param {String} event 事件名 * @param {Function} listener 事件回調(diào)函數(shù) */ off(event, listener) { const listeners = this._store[event] || (this._store[event] = []); listeners.splice(listeners.findIndex(item => item === listener), 1); } /** * 事件監(jiān)聽 僅監(jiān)聽一次 * @param {String} event 事件名 * @param {Function} listener 事件回調(diào)函數(shù) */ once(event, listener) { const proxyListener = (data) => { isFunc(listener) && listener.call(null, data); this.off(event, proxyListener); } this.on(event, proxyListener); } /** * 觸發(fā)事件 * @param {String} 事件名 * @param {Object} 傳給事件回調(diào)函數(shù)的參數(shù) */ emit(event, data) { const listeners = this._store[event] || (this._store[event] = []); for (const listener of listeners) { isFunc(listener) && listener.call(null, data); } } }
創(chuàng)建 Storage
export class Storage { constructor() { this._store = {}; } add(key, val) { this._store[key] = val; } get(key) { return this._store[key]; } remove(key) { delete this._store[key]; } clear() { this._store = {}; } } export default new Storage();
第一個(gè)頁(yè)面中的處理
選擇城市所在城市 {{ cityName || '請(qǐng)選擇' }}
第二個(gè)頁(yè)面中的處理
城市列表
傳送門
github
總結(jié)
之所以將Storage定義成全局的,是為了保證第一個(gè)頁(yè)面放到Storage中和第二個(gè)頁(yè)面從 Storage 中取出的emitter是同一個(gè)實(shí)例,如此第一個(gè)頁(yè)面才能正確監(jiān)聽到第二個(gè)頁(yè)面觸發(fā)的事件。愛掏網(wǎng) - it200.com也可以使用 vuex,將 emitter 放到 state 中。愛掏網(wǎng) - it200.com
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持。愛掏網(wǎng) - it200.com