vue实现拖拽排序

1.给每一列添加:draggable=“true”

<ul>
 	<li v-for="(item,index) in listData" 
 		:key="index" 
 		:draggable="true" 
 		@dragenter.prevent 
 		@dragover.prevent 
 		@dragstart="dragStart(index)" 
 		@dragenter="dragEnter(index)" 
 		@dragend="dragEnd"
 	>
		<span>{{ item.label}}</span>
	</li>
</ul>
<script lang="ts">
import {defineComponent,defineAsyncComponent,reactive} from "vue";
export default defineComponent({
  setup() {
    const state = reactive<any>({
      listData: [],
      dragIndex: null
    });

    function dragStart(index:any){
      state.dragIndex = index;
    }
 
    function dragEnter(index:any){
      if (state.dragIndex !== index) {
        const source = state.listData[state.dragIndex];
        state.listData.splice(state.dragIndex, 1);
        state.listData.splice(index, 0, source);
        state.dragIndex = index;
      }
    }
    
	function dragEnd(){
		console.log(state.listData,'listData')
		//再调接口将listData传给后端即可。
    }
    
    return {
      ...toRefs(state),
      dragStart,
      dragEnter,
      dragEnd
    };
  },
});
</script>

2.使用sortablejs, row-key为唯一标识

npm i sortablejs

<template>
	<el-table :data="sortTable" row-key="pkId">
		<el-table-column label="名称" prop="labelName"></el-table-column>
	</el-table>
</template>

<script lang="ts">
import { defineComponent, onMounted, reactive } from 'vue';
import Sortable from 'sortablejs';
export default defineComponent({
	setup() {
		const state = reactive({
			sortTable: [],
		});
		
		onMounted(() => {
			rowDrop();
		});
		
		function rowDrop() {
			const tbody = document.querySelector('.el-table .el-table__body-wrapper tbody') as HTMLElement;
			Sortable.create(tbody, {
				animation: 150,
				delay: 0,
				// 结束拖拽后的回调函数
				onEnd: (evt: { newIndex: any; oldIndex: any }) => {
					const currentRow = state.sortTable.splice(evt.oldIndex, 1)[0];
					state.sortTable.splice(evt.newIndex, 0, currentRow);
				},
			});
		}
		
		return {
			...toRefs(state),
			rowDrop,
		};
	},
});
</script>
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值