|
|
@@ -1,3 +1,17 @@
|
|
|
+/**
|
|
|
+ * 包含功能:
|
|
|
+ * wx.$get 获取值 wx.$watch 监听值 wx.$emit 提交值
|
|
|
+ *
|
|
|
+ * 使用方法:
|
|
|
+ * 普通页面使用方法 在页面onLoad或者onShow里面设置监听 推荐在onLoad监听 onShow会增加额外的变更回调函数开销
|
|
|
+ * 组件中使用方法 在onready中设置监听
|
|
|
+ *
|
|
|
+ * 注意事项:
|
|
|
+ * 1、在组件中使用时需手动引入 wx.$behavior 该方法会在组件卸载时自动卸载监听函数 在页面中使用时会在页面卸载时自动移除监听函数 防止抓住页面不放造成小程序卡顿
|
|
|
+ * 2、如仅仅是需要储存值获取值 不需要实时对在栈中的页面进行操作 推荐使用app.globalData
|
|
|
+ * 3、不建议在基础组件中使用 例如列表组件的子组件 会大量重复渲染推荐使用状态控制 这个方法并没有做优化
|
|
|
+ */
|
|
|
+
|
|
|
class Watch {
|
|
|
constructor(that, watchData) {
|
|
|
// watch函数回调集合
|
|
|
@@ -84,14 +98,15 @@ class Watch {
|
|
|
[key]: this.$_watchCallBack[key] || []
|
|
|
});
|
|
|
// 判断页面是否存入过该方法 若存入过则更改回调方法 否则推入函数
|
|
|
- let _index = this.$_watchCallBack[key].findIndex(val => val.name === page.__wxExparserNodeId__);
|
|
|
+ let _index = this.$_watchCallBack[key].findIndex(val => val.name === page.$$PageName);
|
|
|
if (_index === -1) {
|
|
|
console.info(`${page.is} watch=>`, key)
|
|
|
// 添加自动移除的方法
|
|
|
page = this.$_autoRemove(key, page)
|
|
|
+ page.$$PageName = Symbol("PageName");
|
|
|
// 推入新的监听事件
|
|
|
this.$_watchCallBack[key].push({
|
|
|
- name: page.__wxExparserNodeId__,
|
|
|
+ name: page.$$PageName,
|
|
|
page,
|
|
|
cb: callback
|
|
|
})
|
|
|
@@ -99,16 +114,18 @@ class Watch {
|
|
|
// 存在则改写回调函数
|
|
|
this.$_watchCallBack[key][_index].cb = callback;
|
|
|
}
|
|
|
+ console.log(Symbol("wangxin"))
|
|
|
+ console.log(page)
|
|
|
}
|
|
|
/**
|
|
|
* 移除监听事件
|
|
|
- * @key {String} 需要移除监听的键值
|
|
|
+ * @key {String} 需要移除监听的键值
|
|
|
* @page {Object} 需移除监听的页面
|
|
|
* @callback {function} 移除监听完成的回调函数
|
|
|
*/
|
|
|
$_remove(key, page, callback) {
|
|
|
// 获取索引
|
|
|
- let _index = this.$_watchCallBack[key].findIndex(val => val.name === page.__wxExparserNodeId__);
|
|
|
+ let _index = this.$_watchCallBack[key].findIndex(val => val.name === page.$$PageName);
|
|
|
if (_index !== -1) {
|
|
|
// 移除监听
|
|
|
let _item = this.$_watchCallBack[key].splice(_index, 1);
|