最新公告
  • 欢迎您光临立业阁,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 多个页面传参通信在微信小程序中的实现_小程序开发教程


    刚接触微信小程序,对里面的语法和属性还不怎么了解,最近正在努力学习中,下面这篇文章主要给大家介绍了微信小程序中多个页面传参通信的相关资料,是最近学习的一个内容总结,需要的朋友可以参考借鉴,下面来一起看看吧。

    前言

    微信小程序越来越火,不少公司都在将原生代码转为微信小程序代码。在开发过程中,由于微信小程序wx.navigateBack方法并不支持返回传参,导致一些页面,尤其是从列表页面跳入详情页,用户在详情页改变了状态,返回后无论是否刷新页面,体验都不是很好。在android中,我们一般采用setresult方法来返回参数,或者直接使用rxjava框架或者eventbus框架来解决此类问题。

    业务分析

    此类需求大概意思是:A页面进入B页面,B页面返回并传值给A。

    探索之路

    刚开始我想采用一个比较偷懒的方法,利用微信的wx.setStorage缓存在B页面存储,返回A页面,在onshow方法里调用wx.getStorage读取缓存来实现此功能。但是想想解决方式过于投机取巧,也会给日后维护带来大量隐患。
    随后我在网上找到获取前一个page的方法,也可以实现此功能,部分代码如下:

    var pages = getCurrentPages();
    var currPage = pages[pages.length - 1]; //当前页面
    var prevPage = pages[pages.length - 2]; //上一个页面
    
    //直接调用上一个页面的setData()方法,把数据存到上一个页面中去
    prevPage.setData({
     mdata:1 
    })

    仔细想了下,代码也不是很安全,因为进B页面的入口可能是多个,这样会导致获取的page出错。

    本来是没招了,突然想到微信小程序支持js,然后就找了个轻量级的js库,而且是观察者模式,是我想要的类型。于是,好戏开始了

    onfire.js介绍

    onfire.js 是一个很简单的事件分发的Javascript库(仅仅 0.9kb),简洁实用。

    可以用于:

    • 简单的事件分发;

    • react / vue.js / angular 用于跨组件的轻量级实现;

    • 事件订阅和发布;

    实践

    整理下思路如下:

    • A页面先订阅一个事件,并定义处理方法。

    • B页面返回时发送消息

    • A页面卸载时,解除订阅。

    A页面代码:

    var onfire = require("../utils/onfire.js");
    var that;
    var eventObj = onfire.on('key', function () {
     //做具体的事
    });
    
    Page({
     data: {
     },
     onLoad: function(options) {
     // Do some initialize when page load.
     },
     onReady: function() {
     // Do something when page ready.
     },
     onUnload: function (e) {
     onfire.un('key');
     onfire.un(eventObj2);
     }
    })

    直接调用onfire.on方法订阅一个名字为key的消息,并且无传参。如果需要传参的话,直接在function里增加参数即可,如var eventObj = onfire.on('key', function (data)...

    需要注意:一定要在onUnload里取消订阅key的消息,并取消绑定eventObj

    B页面里代码在回调的地方加入

     onfire.fire('key');//key为上文中订阅的消息
     //有参数时
     onfire.fire('key','test');

    分析库代码

     function _bind(eventName, callback, is_one, context) {
     if (typeof eventName !== string_str || typeof callback !== function_str) {
      throw new Error('args: '+string_str+', '+function_str+'');
     }
     if (! hasOwnKey(onfireEvents, eventName)) {
      onfireEvents[eventName] = {};
     }
     onfireEvents[eventName][++cnt] = [callback, is_one, context];
    
     return [eventName, cnt];
     }

    从代码中可以看出订阅on方法的时候实际调用_bind方法,该方法,主要是利用一个二维数组来存储订阅的对象

     function _fire_func(eventName, args) {
     if (hasOwnKey(onfireEvents, eventName)) {
      _each(onfireEvents[eventName], function(key, item) {
      item[0].apply(item[2], args); //执行订阅时的方法
      if (item[1]) delete onfireEvents[eventName][key]; // 当类型为只订阅一次时,通知后即移除自己。
      });
     }
     }

    fire发送消息方法实质调用_fire_func方法,通过名字key来遍历订阅者,然后通知订阅者。

     function un(event) {
     var eventName, key, r = false, type = typeof event;
     if (type === string_str) {
      // 如果存在key值,则移除数组
      if (hasOwnKey(onfireEvents, event)) {
      delete onfireEvents[event];
      return true;
      }
      return false;
     }
     else if (type === 'object') {
      eventName = event[0];
      key = event[1];
      //如果找到这个对象则卸载
      if (hasOwnKey(onfireEvents, eventName) && hasOwnKey(onfireEvents[eventName], key)) {
      delete onfireEvents[eventName][key];
      return true;
      }
      //否则返回false
      return false;
     }
     else if (type === function_str) {
      //两层循环来判断是否是方法名
      _each(onfireEvents, function(key_1, item_1) {
      _each(item_1, function(key_2, item_2) {
       if (item_2[0] === event) {
       delete onfireEvents[key_1][key_2];
       r = true;
       }
      });
      });
      return r;
     }
     return true;
     }

    因为卸载支持按key、对象、方法卸载,所以需要先判断类型,然后按各自规则去解除绑定。

    总结

    以上就是多个页面传参通信在微信小程序中的实现的详细内容,更多请关注liyege.cn其它相关文章!

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    • 971会员总数(位)
    • 111831资源总数(个)
    • 2本周发布(个)
    • 0 今日发布(个)
    • 203稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情
    冀ICP备19022365号-1 百度地图

    侵权联系邮箱[email protected]

    立业阁(www.liyege.cn)免费提供wordpress主题模板、dedecms模板、帝国cms模板、小说网站源码、电影网站源码以及网络技术分享,建站源码,小说模板,电影模板,网赚教程,VPS推荐