TableRowDragUpDown.vue 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <template>
  2. <img
  3. :draggable="true"
  4. @dragstart="(e)=>HandleDragStart(e)"
  5. @dragend="(e)=>HandleDragEnd(e,tableRow,currentIndex - 1)"
  6. :src="moveIcon" alt="">
  7. </template>
  8. <script setup lang="ts">
  9. import { ref,watch } from 'vue';
  10. import moveIcon from '@/assets/icon/move_up_down.png'
  11. import { number } from 'echarts';
  12. const props = defineProps({
  13. defaultTableData:{
  14. type:Array,
  15. default:()=>[]
  16. },
  17. tableRow:{
  18. type:Object,
  19. required:true
  20. },
  21. currentIndex:{
  22. type:Number,
  23. required:true
  24. },
  25. rowHeight:{
  26. type:number,
  27. default:52
  28. },
  29. startIndex:{
  30. type:Number,
  31. required:true,
  32. },
  33. endIndex:{
  34. type:number,
  35. required:true
  36. }
  37. })
  38. const emit = defineEmits(['moveChange'])
  39. const tableData = ref([])
  40. const startYPointer = ref(0)
  41. const HandleDragStart = (e)=>{
  42. console.log('开始拖动了',e)
  43. startYPointer.value = e.clientY
  44. }
  45. const HandleDragEnd = (e,row,currentIndex)=>{
  46. console.log('结束拖动了',e)
  47. let endYPointer = e.clientY
  48. let moveNum = 0
  49. if(endYPointer > startYPointer.value){
  50. // 下移
  51. moveNum = Math.ceil((endYPointer - startYPointer.value) / props.rowHeight)
  52. // 替换当前表格的内容
  53. let maxLength = tableData.value.length
  54. if(moveNum > 0){
  55. tableData.value.splice(currentIndex,1)
  56. tableData.value.splice(Math.min(currentIndex + moveNum - 1,props.endIndex),0,row)
  57. emit('moveChange',tableData.value)
  58. }
  59. }else{
  60. // 上移
  61. moveNum = Math.ceil(( startYPointer.value - endYPointer) / props.rowHeight)
  62. // 替换当前表格的内容
  63. if(moveNum > 0){
  64. tableData.value.splice(currentIndex,1)
  65. tableData.value.splice(Math.max(currentIndex - moveNum,props.startIndex),0,row)
  66. emit('moveChange',tableData.value)
  67. }
  68. }
  69. }
  70. watch(()=>props.defaultTableData,(newVal)=>{
  71. tableData.value = [...(newVal || [])]
  72. },{immediate:true,deep:true})
  73. </script>
  74. <style lang="scss" scoped>
  75. </style>