微信小程序跨頁面數據傳遞事件響應實現過程解析

    這篇文章主要介紹了微信小程序跨頁面數據傳遞事件響應實現過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

    在實際工作中有很多場景需要在第二個頁面中將用戶操作之后的將數據回傳到上一頁面。愛掏網 - it200.com接下來將我的方案分享給小伙伴。愛掏網 - it200.com 本次示例采用 uni-app 框架和 weui 樣式庫 實現思路 創建一個 Emitter,用于事件處理 創建一個 ...

    在實際工作中有很多場景需要在第二個頁面中將用戶操作之后的將數據回傳到上一頁面。愛掏網 - it200.com接下來將我的方案分享給小伙伴。愛掏網 - it200.com

    本次示例采用 uni-app 框架和 weui 樣式庫

    實現思路

    • 創建一個 Emitter,用于事件處理
    • 創建一個全局的 Storage
    • 在第一個頁面創建一個 emitter 對象,并添加事件監聽,將 emitter 存儲到 Storage 中
    • 在第二個頁面從 Storage 中取出 emitter 對象, 并觸發事件,將數據傳遞到第一個頁面中做處理

    創建 Emitter

    function isFunc(fn) {
     return typeof fn === 'function';
    }
    
    export default class Emitter {
     constructor() {
     this._store = {};
     }
    
     /**
     * 事件監聽
     * @param {String} event 事件名
     * @param {Function} listener 事件回調函數
     */
     on(event, listener) {
     const listeners = this._store[event] || (this._store[event] = []);
    
     listeners.push(listener);
     }
    
     /**
     * 取消事件監聽
     * @param {String} event 事件名
     * @param {Function} listener 事件回調函數
     */
     off(event, listener) {
     const listeners = this._store[event] || (this._store[event] = []);
    
     listeners.splice(listeners.findIndex(item => item === listener), 1);
     }
    
     /**
     * 事件監聽 僅監聽一次
     * @param {String} event 事件名
     * @param {Function} listener 事件回調函數
     */
     once(event, listener) {
     const proxyListener = (data) => {
      isFunc(listener) && listener.call(null, data);
    
      this.off(event, proxyListener);
     }
    
     this.on(event, proxyListener);
     }
    
     /**
     * 觸發事件
     * @param {String} 事件名
     * @param {Object} 傳給事件回調函數的參數
     */
     emit(event, data) {
     const listeners = this._store[event] || (this._store[event] = []);
    
     for (const listener of listeners) {
      isFunc(listener) && listener.call(null, data);
     }
     }
    }

    創建 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();

    第一個頁面中的處理

    第二個頁面中的處理

    傳送門

    github

    總結

    之所以將Storage定義成全局的,是為了保證第一個頁面放到Storage中和第二個頁面從 Storage 中取出的emitter是同一個實例,如此第一個頁面才能正確監聽到第二個頁面觸發的事件。愛掏網 - it200.com也可以使用 vuex,將 emitter 放到 state 中。愛掏網 - it200.com

    以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持。愛掏網 - it200.com


    聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。
    發表評論
    更多 網友評論0 條評論)
    暫無評論

    返回頂部

    主站蜘蛛池模板: 黄桃AV无码免费一区二区三区| 精品国产亚洲一区二区三区在线观看 | 亚洲一区二区三区在线观看蜜桃 | 国产午夜精品一区二区| 在线播放国产一区二区三区 | 亚洲AV无码国产精品永久一区| 日韩人妻无码一区二区三区99 | 亚洲AV无码一区二区乱子仑| 中文字幕日韩一区| 成人h动漫精品一区二区无码| 少妇人妻精品一区二区| 中文字幕一区二区日产乱码| 亚洲AV色香蕉一区二区| 中文字幕一区视频| 一区二区三区视频在线播放| 亚洲一区二区三区首页| 精品人妻少妇一区二区三区| 亚洲视频一区网站| 日韩精品无码一区二区三区| 乱色熟女综合一区二区三区| 午夜精品一区二区三区在线视| 精品无码AV一区二区三区不卡 | 国产一区二区影院| 国产一区二区三区福利| 亚洲一区二区三区久久| 午夜天堂一区人妻| 91精品一区二区| 精品国产AV一区二区三区| 亚洲视频一区网站| 国模无码视频一区二区三区| 中文字幕一区在线观看视频| 日韩一区二区在线视频| 亚洲AV无码一区二区三区电影| 无码国产精品一区二区免费I6| 国产av夜夜欢一区二区三区| 国产精品被窝福利一区 | 午夜无码一区二区三区在线观看 | 国产综合精品一区二区三区| 亚洲AV美女一区二区三区| 偷拍激情视频一区二区三区| 精品日韩一区二区三区视频|