index.wxs 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /**
  2. * 监听页面内值的变化,主要用于动态开关swipe-action
  3. * @param {Object} newValue
  4. * @param {Object} oldValue
  5. * @param {Object} ownerInstance
  6. * @param {Object} instance
  7. */
  8. function sizeReady(newValue, oldValue, ownerInstance, instance) {
  9. var state = instance.getState()
  10. state.position = JSON.parse(newValue)
  11. if (!state.position || state.position.length === 0) return
  12. var show = state.position[0].show
  13. state.left = state.left || state.position[0].left;
  14. // 通过用户变量,开启或关闭
  15. if (show) {
  16. openState(true, instance, ownerInstance)
  17. } else {
  18. openState(false, instance, ownerInstance)
  19. }
  20. }
  21. /**
  22. * 开始触摸操作
  23. * @param {Object} e
  24. * @param {Object} ins
  25. */
  26. function touchstart(e, ins) {
  27. var instance = e.instance;
  28. var state = instance.getState();
  29. var pageX = e.touches[0].pageX;
  30. // 开始触摸时移除动画类
  31. instance.removeClass('ani');
  32. var owner = ins.selectAllComponents('.button-hock')
  33. for (var i = 0; i < owner.length; i++) {
  34. owner[i].removeClass('ani');
  35. }
  36. // state.position = JSON.parse(instance.getDataset().position);
  37. state.left = state.left || state.position[0].left;
  38. // 获取最终按钮组的宽度
  39. state.width = pageX - state.left;
  40. ins.callMethod('closeSwipe')
  41. }
  42. /**
  43. * 开始滑动操作
  44. * @param {Object} e
  45. * @param {Object} ownerInstance
  46. */
  47. function touchmove(e, ownerInstance) {
  48. var instance = e.instance;
  49. var disabled = instance.getDataset().disabled
  50. var state = instance.getState()
  51. // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
  52. disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;
  53. if (disabled) return
  54. var pageX = e.touches[0].pageX;
  55. move(pageX - state.width, instance, ownerInstance)
  56. }
  57. /**
  58. * 结束触摸操作
  59. * @param {Object} e
  60. * @param {Object} ownerInstance
  61. */
  62. function touchend(e, ownerInstance) {
  63. var instance = e.instance;
  64. var disabled = instance.getDataset().disabled
  65. var state = instance.getState()
  66. // fix by mehaotian, TODO 兼容 app-vue 获取dataset为字符串 , h5 获取 为 undefined 的问题,待框架修复
  67. disabled = (typeof(disabled) === 'string' ? JSON.parse(disabled) : disabled) || false;
  68. if (disabled) return
  69. // 滑动过程中触摸结束,通过阙值判断是开启还是关闭
  70. moveDirection(state.left, -40, instance, ownerInstance)
  71. }
  72. /**
  73. * 设置移动距离
  74. * @param {Object} value
  75. * @param {Object} instance
  76. * @param {Object} ownerInstance
  77. */
  78. function move(value, instance, ownerInstance) {
  79. var state = instance.getState()
  80. // 获取可滑动范围
  81. var x = Math.max(-state.position[1].width, Math.min((value), 0));
  82. state.left = x;
  83. instance.setStyle({
  84. transform: 'translateX(' + x + 'px)',
  85. '-webkit-transform': 'translateX(' + x + 'px)'
  86. })
  87. // 折叠按钮动画
  88. buttonFold(x, instance, ownerInstance)
  89. }
  90. /**
  91. * 移动方向判断
  92. * @param {Object} left
  93. * @param {Object} value
  94. * @param {Object} ownerInstance
  95. * @param {Object} ins
  96. */
  97. function moveDirection(left, value, ins, ownerInstance) {
  98. var state = ins.getState()
  99. var position = state.position
  100. var isopen = state.isopen
  101. if (!position[1].width) {
  102. openState(false, ins, ownerInstance)
  103. return
  104. }
  105. // 如果已经是打开状态,进行判断是否关闭,还是保留打开状态
  106. if (isopen) {
  107. if (-left <= position[1].width) {
  108. openState(false, ins, ownerInstance)
  109. } else {
  110. openState(true, ins, ownerInstance)
  111. }
  112. return
  113. }
  114. // 如果是关闭状态,进行判断是否打开,还是保留关闭状态
  115. if (left <= value) {
  116. openState(true, ins, ownerInstance)
  117. } else {
  118. openState(false, ins, ownerInstance)
  119. }
  120. }
  121. /**
  122. * 设置按钮移动距离
  123. * @param {Object} value
  124. * @param {Object} instance
  125. * @param {Object} ownerInstance
  126. */
  127. function buttonFold(value, instance, ownerInstance) {
  128. var ins = ownerInstance.selectAllComponents('.button-hock');
  129. var state = instance.getState();
  130. var position = state.position;
  131. var arr = [];
  132. var w = 0;
  133. for (var i = 0; i < ins.length; i++) {
  134. if (!ins[i].getDataset().button) return
  135. var btnData = JSON.parse(ins[i].getDataset().button)
  136. // fix by mehaotian TODO 在 app-vue 中,字符串转对象,需要转两次,这里先这么兼容
  137. if (typeof(btnData) === 'string') {
  138. btnData = JSON.parse(btnData)
  139. }
  140. var button = btnData[i] && btnData[i].width || 0
  141. w += button
  142. arr.push(-w)
  143. // 动态计算按钮组每个按钮的折叠动画移动距离
  144. var distance = arr[i - 1] + value * (arr[i - 1] / position[1].width)
  145. if (i != 0) {
  146. ins[i].setStyle({
  147. transform: 'translateX(' + distance + 'px)',
  148. })
  149. }
  150. }
  151. }
  152. /**
  153. * 开启状态
  154. * @param {Boolean} type
  155. * @param {Object} ins
  156. * @param {Object} ownerInstance
  157. */
  158. function openState(type, ins, ownerInstance) {
  159. var state = ins.getState()
  160. var position = state.position
  161. if (state.isopen === undefined) {
  162. state.isopen = false
  163. }
  164. // 只有状态有改变才会通知页面改变状态
  165. if (state.isopen !== type) {
  166. // 通知页面,已经打开
  167. ownerInstance.callMethod('change', {
  168. open: type
  169. })
  170. }
  171. // 设置打开和移动状态
  172. state.isopen = type
  173. // 添加动画类
  174. ins.addClass('ani');
  175. var owner = ownerInstance.selectAllComponents('.button-hock')
  176. for (var i = 0; i < owner.length; i++) {
  177. owner[i].addClass('ani');
  178. }
  179. // 设置最终移动位置
  180. move(type ? -position[1].width : 0, ins, ownerInstance)
  181. }
  182. module.exports = {
  183. sizeReady: sizeReady,
  184. touchstart: touchstart,
  185. touchmove: touchmove,
  186. touchend: touchend
  187. }