index.wxs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. // console.log("sizeReady:",state);
  14. state.left = state.left || state.position[0].left;
  15. // 通过用户变量,开启或关闭
  16. if (show) {
  17. openState(true, instance, ownerInstance)
  18. } else {
  19. openState(false, instance, ownerInstance)
  20. }
  21. }
  22. /**
  23. * 开始触摸操作
  24. * @param {Object} e
  25. * @param {Object} ins
  26. */
  27. function touchstart(e, ins) {
  28. var instance = e.instance;
  29. var state = instance.getState();
  30. var pageX = e.touches[0].pageX;
  31. // 开始触摸时移除动画类
  32. instance.removeClass('ani');
  33. var owner = ins.selectAllComponents('.button-hock')
  34. for (var i = 0; i < owner.length; i++) {
  35. owner[i].removeClass('ani');
  36. }
  37. console.log(state);
  38. // state.position = JSON.parse(instance.getDataset().position);
  39. state.left = state.left || state.position[0].left;
  40. // 获取最终按钮组的宽度
  41. state.width = pageX - state.left;
  42. ins.callMethod('openSwipe')
  43. }
  44. /**
  45. * 开始滑动操作
  46. * @param {Object} e
  47. * @param {Object} ownerInstance
  48. */
  49. function touchmove(e, ownerInstance) {
  50. var instance = e.instance;
  51. var disabled = instance.getDataset().disabled
  52. var state = instance.getState()
  53. console.log(state);
  54. if (disabled) return
  55. var pageX = e.touches[0].pageX;
  56. move(pageX - state.width, instance, ownerInstance)
  57. }
  58. /**
  59. * 结束触摸操作
  60. * @param {Object} e
  61. * @param {Object} ownerInstance
  62. */
  63. function touchend(e, ownerInstance) {
  64. var instance = e.instance;
  65. var disabled = instance.getDataset().disabled
  66. var state = instance.getState()
  67. if (disabled) return
  68. // 滑动过程中触摸结束,通过阙值判断是开启还是关闭
  69. moveDirection(state.left, -40, instance, ownerInstance)
  70. }
  71. /**
  72. * 设置移动距离
  73. * @param {Object} value
  74. * @param {Object} instance
  75. * @param {Object} ownerInstance
  76. */
  77. function move(value, instance, ownerInstance) {
  78. var state = instance.getState()
  79. // 获取可滑动范围
  80. var x = Math.max(-state.position[1].width, Math.min((value), 0));
  81. state.left = x;
  82. instance.setStyle({
  83. transform: 'translateX(' + x + 'px)',
  84. '-webkit-transform': 'translateX(' + x + 'px)'
  85. })
  86. // 折叠按钮动画
  87. buttonFold(x, instance, ownerInstance)
  88. }
  89. /**
  90. * 移动方向判断
  91. * @param {Object} left
  92. * @param {Object} value
  93. * @param {Object} ownerInstance
  94. * @param {Object} ins
  95. */
  96. function moveDirection(left, value, ins, ownerInstance) {
  97. var state = ins.getState()
  98. var position = state.position
  99. var isopen = state.isopen
  100. if (!position[1].width) {
  101. openState(false, ins, ownerInstance)
  102. return
  103. }
  104. // 如果已经是打开状态,进行判断是否关闭,还是保留打开状态
  105. if (isopen) {
  106. if (-left <= position[1].width) {
  107. openState(false, ins, ownerInstance)
  108. } else {
  109. openState(true, ins, ownerInstance)
  110. }
  111. return
  112. }
  113. // 如果是关闭状态,进行判断是否打开,还是保留关闭状态
  114. if (left <= value) {
  115. openState(true, ins, ownerInstance)
  116. } else {
  117. openState(false, ins, ownerInstance)
  118. }
  119. }
  120. /**
  121. * 设置按钮移动距离
  122. * @param {Object} value
  123. * @param {Object} instance
  124. * @param {Object} ownerInstance
  125. */
  126. function buttonFold(value, instance, ownerInstance) {
  127. var ins = ownerInstance.selectAllComponents('.button-hock');
  128. var state = instance.getState();
  129. var position = state.position;
  130. var arr = [];
  131. var w = 0;
  132. for (var i = 0; i < ins.length; i++) {
  133. if (!ins[i].getDataset().button) return
  134. var btnData = JSON.parse(ins[i].getDataset().button)
  135. var button = btnData[i] && btnData[i].width || 0
  136. w += button
  137. arr.push(-w)
  138. // 动态计算按钮组每个按钮的折叠动画移动距离
  139. var distance = arr[i - 1] + value * (arr[i - 1] / position[1].width)
  140. if (i != 0) {
  141. ins[i].setStyle({
  142. transform: 'translateX(' + distance + 'px)',
  143. })
  144. }
  145. }
  146. }
  147. /**
  148. * 开启状态
  149. * @param {Boolean} type
  150. * @param {Object} ins
  151. * @param {Object} ownerInstance
  152. */
  153. function openState(type, ins, ownerInstance) {
  154. var state = ins.getState()
  155. var position = state.position
  156. // 设置打开和移动状态
  157. state.isopen = type
  158. // 通知页面,已经打开
  159. ownerInstance.callMethod('change', {
  160. open: type
  161. })
  162. // 添加动画类
  163. ins.addClass('ani');
  164. var owner = ownerInstance.selectAllComponents('.button-hock')
  165. for (var i = 0; i < owner.length; i++) {
  166. owner[i].addClass('ani');
  167. }
  168. // 设置最终移动位置
  169. move(type ? -position[1].width : 0, ins, ownerInstance)
  170. }
  171. module.exports = {
  172. sizeReady: sizeReady,
  173. touchstart: touchstart,
  174. touchmove: touchmove,
  175. touchend: touchend
  176. }