bars_sort.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <template>
  2. <view class="content">
  3. <!-- 参数
  4. * @property {ObjectArray} list = [] 列表数据,自定义数据,会传递到name="rowContent"插槽
  5. * @property {Boolean} feedbackGeneratorState = [true|false] 是否开启拖动触感反馈
  6. * @property {Boolean} isLongTouch = [true|false] 是否开启长按拖动
  7. * @property {Boolean} isAutoScroll = [true|false] 是否拖拽至边缘自动滚动列表
  8. * @property {Number} longTouchTime = [] 选填,触发长按时长,单位:ms,默认350ms,不支持微信小程序
  9. * @property {Number} listHeight = [] 选填,可拖动列表整体的高度,单位:px,默认等于窗口高度
  10. * @property {Number} rowHeight = [] 必填,行高,单位:px,默认44px
  11. * @event {Function} change 行位置发生改变时触发事件 返回值:{index:'原始下标',moveTo:'被拖动到的下标',moveRow:'拖动行数据'}
  12. * @event {Function} confirm 拖拽结束且行位置发生了改变触发事件 返回值:{index:'原始下标',moveTo:'被拖动到的下标',moveRow:'拖动行数据',list:'整个列表拖动后的数据'}
  13. * @event {Function} onclick 点击行触发事件 返回值:{index:'被点击行下标',value:'被点击行数据'}
  14. */
  15. -->
  16. <!-- 当前属性设置 isLongTouch关闭长按拖动 isAutoScroll开启自动滚动 feedbackGeneratorState开启触感反馈 rowHeight行高55 -->
  17. <HM-dragSorts :list="list" :isLongTouch="false" :isAutoScroll="true" :feedbackGeneratorState="true"
  18. :rowHeight="55" @change="change" @confirm="confirm" @onclick="onclick">
  19. <template v-slot:rowContent="{row}">
  20. <view class="row">
  21. <!-- <image v-if="row.icon" class="icon" :src="row.icon"></image> -->
  22. <image v-if="row.index%7 == 1" class="icon" src="./icon/01.png" mode=""></image>
  23. <image v-if="row.index%7 == 2" class="icon" src="./icon/02.png" mode=""></image>
  24. <image v-if="row.index%7 == 3" class="icon" src="./icon/03.png" mode=""></image>
  25. <image v-if="row.index%7 == 4" class="icon" src="./icon/04.png" mode=""></image>
  26. <image v-if="row.index%7 == 5" class="icon" src="./icon/05.png" mode=""></image>
  27. <image v-if="row.index%7 == 6" class="icon" src="./icon/06.png" mode=""></image>
  28. <image v-if="row.index%7 == 7" class="icon" src="./icon/07.png" mode=""></image>
  29. <image v-if="row.index%7 == 0" class="icon" src="./icon/08.png" mode=""></image>
  30. <text class="text">{{row.page_name}}</text>
  31. </view>
  32. </template>
  33. </HM-dragSorts>
  34. </view>
  35. </template>
  36. <script>
  37. export default {
  38. data() {
  39. return {
  40. /*
  41. 0.数据结构说明 可以在结构中添加其他的数据,比如id,value等,不影响组件使用,拖动调整顺序后,组件会把传入的数据排序后原封不动在@confirm中返回。
  42. 1.动态修改list数据,组件会响应变化,但拖动排序不会影响list,
  43. 所以,要特别注意,在动态修改list数据时候,由于组件内数据可能已经拖动重新排序过,页面的list顺序和组件内数据顺序不一致了,
  44. 最好在操作list时候,先和@confirm返回的值同步一下,或者直接操作@confirm返回的值,然后赋值给list。
  45. n.最后,组件你下载了,代码你也看了,不给个五星好评,我可要打人了啊 (╬ ̄皿 ̄)=○ ヽ(#`Д´)ノ
  46. */
  47. list: [],
  48. ispush: false,
  49. index:0
  50. }
  51. },
  52. onLoad() {
  53. this.$api.getCommonMenuList({
  54. }).then((res) => {
  55. console.log(res.data)
  56. this.list = res.data.data
  57. this.list.forEach((item,index) => {
  58. item.index = index;
  59. })
  60. console.log(this.list)
  61. })
  62. },
  63. methods: {
  64. onclick(e) {
  65. // console.log('=== onclick start ===');
  66. // console.log("被点击行: " + JSON.stringify(e.value));
  67. // console.log("被点击下标: " + JSON.stringify(e.index));
  68. // console.log('=== onclick end ===');
  69. uni.showActionSheet({
  70. itemList: ['移除常用'],
  71. success: (res) => {
  72. console.log(e.value.id)
  73. console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
  74. if (res.tapIndex == 0) {
  75. console.log(e.value.id)
  76. this.list.forEach((item, index) => {
  77. console.log(item.id, e.value.id, index)
  78. if (item.id == e.value.id) {
  79. console.log(item)
  80. this.list.splice(index, 1)
  81. }
  82. })
  83. console.log(this.list);
  84. uni.showLoading({
  85. mask: true
  86. })
  87. this.$api.editCommonMenu({
  88. data: JSON.stringify(this.list)
  89. }).then((res) => {
  90. uni.hideLoading()
  91. uni.showToast({
  92. icon: "none",
  93. title: "移除成功"
  94. })
  95. console.log(res)
  96. })
  97. }
  98. },
  99. fail: (res) => {
  100. console.log(res.errMsg);
  101. }
  102. });
  103. },
  104. change(e) {
  105. // console.log('=== change start ===');
  106. // console.log("被拖动行: " + JSON.stringify(e.moveRow));
  107. // console.log('原始下标:', e.index);
  108. // console.log('移动到:', e.moveTo);
  109. // console.log('=== change end ===');
  110. },
  111. confirm(e) {
  112. console.log("this.list: ", this.list);
  113. console.log("e.list: ", e.list);
  114. this.list = e.list
  115. console.log(this.list);
  116. uni.showLoading({
  117. mask: true
  118. })
  119. this.$api.editCommonMenu({
  120. data: JSON.stringify(this.list)
  121. }).then((res) => {
  122. uni.hideLoading()
  123. uni.showToast({
  124. icon: "none",
  125. title: "排序成功"
  126. })
  127. console.log(res)
  128. })
  129. // console.log('=== confirm start ===');
  130. // console.log("被拖动行: " + JSON.stringify(e.moveRow));
  131. // console.log('原始下标:', e.index);
  132. // console.log('移动到:', e.moveTo);
  133. // console.log('=== confirm end ===');
  134. }
  135. }
  136. }
  137. </script>
  138. <style lang="scss" scoped>
  139. //scoped css只在当前页生效 不影响子组件
  140. page {
  141. // background-color: #efeff4;
  142. }
  143. .content {
  144. .row {
  145. display: flex;
  146. flex-direction: row;
  147. align-items: center;
  148. .icon {
  149. width: 40rpx;
  150. height: 40rpx;
  151. margin-right: 13px;
  152. }
  153. .text {
  154. font-size: 14px;
  155. }
  156. }
  157. }
  158. </style>