2020/9/27 0:00:00
泉源:不详
作者:未知
由于微信小程序 wx.navigateBack 要领并不支持返回传值,,,,,,导致页面在返回后,,,,,,不可利便地即时更新数据。。。那么小程序跨页转达事务新闻和数据要怎样解决呢。。。
一.需求剖析
此类需求或许意思是:A 页面进入 B 页面,,,,,,B 页面返回并传值给 A或在B页面触发事务时,,,,,,A页面也有事务触发改变。。。

营业剖析
普遍要领为:
第一种:使用微信的 wx.setStorage,,,,,,将数据缓保存小程序实例内。。。从 B 页面返回 A 页面时,,,,,,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 页面的入口可能是许多个。。。这样做,,,,,,可能会导致获取到的页面实例不准确。。。
二.要领介绍
(onfire.js的下载地点https://github.com/hustcc/onfire.js) 下面进入正题介绍onfire.js() onfire.js 是一个很简朴的事务分发 JavaScript 库(仅仅 0.9kb),,,,,,精练适用。。。它可以应用于: 1.简朴的事务分发。。。 2.在 React、Vue.js、Angular 中用于跨组件的轻量级实现。。。 3.事务订阅和宣布。。。
使用思绪:(做过移动端开发的都知道,,,,,,类似于iOS的通知和安卓的广播) a.A 页面先订阅一个事务,,,,,,并界说处理要领;;;; b.从 B 页面返回时,,,,,,发送新闻;;;; c.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(eventObj);//移除
-
}
-
})
我们可以在 A 页面直接挪用 onfire.on 要领,,,,,,订阅一个名字为 key 的新闻。。。在上面的代码中,,,,,,新闻附带的参数无传参。。。 若是需要传参的话,,,,,,直接在 function 里增添参数即可,,,,,,例如:
-
var eventObj = onfire.on('key', function (data){
-
// 执行操作
-
})
需要注重的是,,,,,,一定要在 onUnload 里(在页面被关闭时)作废订阅新闻,,,,,,并作废绑定 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;
-
}
挪用un要领,,,,,,通过名字(key)来遍历订阅者,,,,,,找到后移除。。。
注:由于卸载支持按 key、工具、要领卸载,,,,,,以是需要先判断类型,,,,,,然后按各自规则去扫除绑定。。。
小程序工具提供多类型商城/门店小程序制作,,,,,,可视化编辑 1秒天生5步上线。。。通过拖拽、拼接???榻峁剐〕绦蛏坛且趁妫,,,,所看即所得,,,,,,只需要美工就能做出细腻商城。。。更多小程序市肆请审查:小程序市肆
【本站声明】
1、本站文章中所选用的图片及文字泉源于网络以及用户投稿,,,,,,由于未联系到知识产权人或未发明有关知识产权的挂号,,,,,,若有知识产权人并不肯意我们使用,,,,,,若是有侵权请连忙联系。。。
2、本网站差池文章中所涉及的内容真实性、准确性、可靠性认真,,,,,,仅系客观性形貌,,,,,,如您需要相识该类商品/服务详细的资讯,,,,,,请您直接与该类商品/服务的提供者联系。。。
KESION pp电子软件
KESION pp电子软件是海内领先的在线教育软件及私域社交电商软件服务提供商,,,,,,恒久专注于为企业提供在线教育软件及社交电商SaaS平台解决方案。。。
公司焦点产品云开店SaaS社交电商服务平台、在线教育SaaS服务平台、教育企业数字化SaaS云平台、企微营销助手、私有化自力安排品牌网校和在线教育咨询等。。。KESION 一直通过手艺立异,,,,,,提供产品和服务,,,,,,助力企业向数字化转型,,,,,,通过科技驱动商业刷新,,,,,,让商业变得更智慧!