proxy.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. class MyProxy {
  2. constructor(that, watchData) {
  3. // watch函数回调集合
  4. that.$_watchCallBack = {}
  5. // 绑定到指定对象
  6. that.$watch = this.$watch;
  7. that.$emit = this.$emit;
  8. that.$get = this.$get;
  9. that.$Behavior = this.$_behavior();
  10. that.$_proxy = this.$_proxy;
  11. that.$_remove = this.$_remove;
  12. that.$_autoRemove = this.$_autoRemove;
  13. // 设置监听对象
  14. this._setWatchData(that, watchData);
  15. }
  16. /**
  17. * 设置被监听的对象
  18. * @that {Object} this对象
  19. * @watchData {object} 被监听的对象
  20. */
  21. _setWatchData(that, watchData) {
  22. that.$watchData = watchData || {}
  23. }
  24. /**
  25. * 设置代理
  26. * @obj {Object} 将要代理的对象
  27. * @callbackArray {Array} 回调函数集合
  28. *
  29. */
  30. $_proxy(key, value) {
  31. const obj = this.$watchData;
  32. let _oldValue = obj[key];
  33. obj[key] = value;
  34. // 确认回调函数存在 循环执行回调数组的方法集合
  35. this.$_watchCallBack[key] && this.$_watchCallBack[key].map(val => val && val.cb && val.cb.call(val.page, value, _oldValue))
  36. }
  37. /**
  38. * 提交值
  39. * @key {String} 提交的键值
  40. * @value {any} 提交的值
  41. * @callback {function} 执行之后完成回调
  42. */
  43. $emit(key, value, callback) {
  44. this.$_proxy(key, value);
  45. callback && callback()
  46. }
  47. /**
  48. * 获取值
  49. * @key {String} 获取的键值
  50. * @callback {function} 获取之后执行回调函数
  51. */
  52. $get(key, callback) {
  53. callback && callback(this.$watchData[key]);
  54. return this.$watchData[key]
  55. }
  56. /**
  57. * 添加watch方法
  58. * @key {String} 要观察的键值
  59. * @page {Object} 需监听的页面
  60. * @callback {function} 需要执行的回调函数
  61. *
  62. */
  63. $watch(key, page, callback) {
  64. // 首先检测 $_watchCallBack 中对应的值是否存在 如果存在就推入方法
  65. this.$_watchCallBack = Object.assign({}, this.$_watchCallBack, {
  66. [key]: this.$_watchCallBack[key] || []
  67. });
  68. // 判断页面是否存入过该方法 若存入过则更改回调方法 否则推入函数
  69. let _index = this.$_watchCallBack[key].findIndex(val => val.name === page.__wxExparserNodeId__);
  70. if (_index === -1) {
  71. console.info(`${page.is} watch=>`, key)
  72. // 添加自动移除的方法
  73. page = this.$_autoRemove(key, page)
  74. // 推入新的监听事件
  75. this.$_watchCallBack[key].push({
  76. name: page.__wxExparserNodeId__,
  77. page,
  78. cb: callback
  79. })
  80. } else {
  81. // 存在则改写回调函数
  82. this.$_watchCallBack[key][_index].cb = callback;
  83. }
  84. }
  85. /**
  86. * 移除监听事件
  87. * @key {String} 需要移除监听的键值
  88. * @page {Object} 需移除监听的页面
  89. * @callback {function} 移除监听完成的回调函数
  90. */
  91. $_remove(key, page, callback) {
  92. // 获取索引
  93. let _index = this.$_watchCallBack[key].findIndex(val => val.name === page.__wxExparserNodeId__);
  94. if (_index !== -1) {
  95. // 移除监听
  96. let _item = this.$_watchCallBack[key].splice(_index, 1);
  97. if (_item) {
  98. // console.log('remove', key, page)
  99. // 确认函数存在 执行回调函数
  100. callback && callback.call(page)
  101. }
  102. }
  103. }
  104. /**
  105. * 自动移除监听
  106. * @key {String} 移除的键值
  107. * @page {Object} 移除的页面
  108. */
  109. $_autoRemove(key, page) {
  110. // 如果是页面则重载onUnload 函数
  111. if (page.route) {
  112. let _onUnload = page.onUnload;
  113. page.onUnload = () => {
  114. this.$_remove(key, page, () => {
  115. console.info(`${page.is} remove=>`, key)
  116. _onUnload()
  117. })
  118. };
  119. return page;
  120. } else {
  121. // 自定义组件暂时没想到什么办法
  122. page.$$_watch = key;
  123. return page;
  124. }
  125. }
  126. /**
  127. * 组件Behavior方法 需自行引入组件的behaviors
  128. */
  129. $_behavior() {
  130. return Behavior({
  131. detached() {
  132. let key = this.$$_watch;
  133. wx.$_remove(this.$$_watch, this, () => {
  134. console.info(`${this.is} remove=>`, key)
  135. })
  136. },
  137. })
  138. }
  139. }
  140. module.exports = {
  141. MyProxy: MyProxy
  142. }