bars_sort.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  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" :rowHeight="55" @change="change" @confirm="confirm" @onclick="onclick" >
  18. <template v-slot:rowContent="{row}">
  19. <view class="row">
  20. <image v-if="row.icon" class="icon" :src="row.icon"></image>
  21. <text class="text">{{row.name}}</text>
  22. </view>
  23. </template>
  24. </HM-dragSorts>
  25. </view>
  26. </template>
  27. <script>
  28. export default {
  29. data() {
  30. return {
  31. /*
  32. 0.数据结构说明 可以在结构中添加其他的数据,比如id,value等,不影响组件使用,拖动调整顺序后,组件会把传入的数据排序后原封不动在@confirm中返回。
  33. 1.动态修改list数据,组件会响应变化,但拖动排序不会影响list,
  34. 所以,要特别注意,在动态修改list数据时候,由于组件内数据可能已经拖动重新排序过,页面的list顺序和组件内数据顺序不一致了,
  35. 最好在操作list时候,先和@confirm返回的值同步一下,或者直接操作@confirm返回的值,然后赋值给list。
  36. n.最后,组件你下载了,代码你也看了,不给个五星好评,我可要打人了啊 (╬ ̄皿 ̄)=○ ヽ(#`Д´)ノ
  37. */
  38. list: [
  39. {
  40. "name": "常用应用1",
  41. "icon": "https://cdn.colorhub.me/ySJOhzQwb6w596c0lDqLQkzET8-ygzR7wsjL83Zzgj0/rs:fill:280:280:0/g:sm/bG9jYWw6Ly8vNmUv/ODcvYTAxMjg4YjVj/N2I1ZTJhOGQ0NmFl/NWU5ODMzNmY0YjFm/NDBhNmU4Ny5qcGVn.jpg",
  42. },
  43. {
  44. "name": "常用应用2",
  45. "icon": "https://cdn.colorhub.me/zu3g7Ra09-XfSrAWZBmnG2zKNtUj2iTb-pPa0UmBOmM/rs:fill:280:280:0/g:sm/bG9jYWw6Ly8vY2Uv/OWIvYTE0YmE1ODE0/NTk1NzFkZDBjZmVm/NWJkNWRlMmQ2Nzhj/YTVkY2U5Yi5qcGVn.jpg"
  46. },
  47. {
  48. "name": "常用应用3",
  49. "icon": "https://cdn.colorhub.me/gwKooJQs_cuEcYPAXki4mIj0QQokmfoK9F7CcnylPY4/rs:fill:280:280:0/g:sm/bG9jYWw6Ly8vNGQv/NTUvY2Y4Njc1ZTdi/ZWRkYjgzMWQzMWEx/MjUxY2U2Y2FjZmE3/NmU5NGQ1NS5qcGVn.jpg"
  50. },
  51. {
  52. "name": "常用应用(0001)",
  53. "icon": "https://cdn.colorhub.me/nxoruPZz2k8PIvdAOR7RPo_kI_o87nj9CEksLl_KUSE/rs:fill:280:280:0/g:sm/bG9jYWw6Ly8vNzIv/YWQvZmY2NzYzNWNh/ZGU3NTM1NTA5MzI0/MzAwYmI0M2QzZmNm/MDNkNzJhZC5qcGVn.jpg"
  54. },
  55. {
  56. "name": "常用应用(4401)",
  57. "icon": "https://cdn.colorhub.me/RBhjyJQzsDku2m0dCRcAp-OAuvg1ACu6AA7DWLgKRu0/rs:auto:280:0:0/g:ce/bG9jYWw6Ly8vMzcv/M2QvNTU3MzA4NzQy/OTA5YjIwOTExMDI3/N2ZlMmRiNjYyMTVk/YmJiMzczZC5qcGVn.jpg"
  58. },
  59. {
  60. "name": "常用应用(7223)",
  61. "icon": "https://cdn.colorhub.me/l33TcVYcCQvkB5LW8IFC2hkfhjPWfrTcL2sOHcrVzho/rs:auto:280:0:0/g:ce/bG9jYWw6Ly8vM2Uv/OGEvZTk4NjE3MTE3/NTQyNTc1NDVhZmQ0/YmYwMDQ5YTYyNTQ0/MDIxM2U4YS5qcGVn.jpg"
  62. }
  63. ],
  64. ispush:false
  65. }
  66. },
  67. onLoad() {
  68. },
  69. methods: {
  70. onclick(e){
  71. console.log('=== onclick start ===');
  72. console.log("被点击行: " + JSON.stringify(e.value));
  73. console.log("被点击下标: " + JSON.stringify(e.index));
  74. console.log('=== onclick end ===');
  75. // uni.showActionSheet({
  76. // itemList: ['移除常用'],
  77. // success: function (res) {
  78. // console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
  79. // },
  80. // fail: function (res) {
  81. // console.log(res.errMsg);
  82. // }
  83. // });
  84. },
  85. change(e){
  86. console.log('=== change start ===');
  87. console.log("被拖动行: " + JSON.stringify(e.moveRow));
  88. console.log('原始下标:',e.index);
  89. console.log('移动到:',e.moveTo);
  90. console.log('=== change end ===');
  91. },
  92. confirm(e){
  93. console.log("this.list: ",this.list);
  94. console.log("e.list: ",e.list);
  95. console.log('=== confirm start ===');
  96. console.log("被拖动行: " + JSON.stringify(e.moveRow));
  97. console.log('原始下标:',e.index);
  98. console.log('移动到:',e.moveTo);
  99. console.log('=== confirm end ===');
  100. }
  101. }
  102. }
  103. </script>
  104. <style lang="scss" scoped>
  105. //scoped css只在当前页生效 不影响子组件
  106. page {
  107. // background-color: #efeff4;
  108. }
  109. .content {
  110. .row{
  111. display: flex;
  112. flex-direction: row;
  113. align-items: center;
  114. .icon{
  115. width: 30px;
  116. height: 30px;
  117. border-radius: 6px;
  118. margin-right: 13px;
  119. }
  120. .text{
  121. font-size: 13px;
  122. }
  123. }
  124. }
  125. </style>