vue3 + element-plus + ts 实现el-table 的拖动多选

效果演示:

 完整代码如下:

<template>
	<div>
		<p>测试拖动多选</p>
		<el-table ref="multipleTableRef" :data="tableData" style="width: 100%" @selection-change="handleSelectionChange"
			@mousedown="mousedownFn" @mousemove="handleMouseMove" @mouseup="mouseupFn">
			<el-table-column type="selection" width="55" />
			<el-table-column label="Date" width="120">
				<template #default="scope">{{ scope.row.date }}</template>
			</el-table-column>
			<el-table-column property="name" label="Name" width="120" />
			<el-table-column property="address" label="Address" show-overflow-tooltip />
		</el-table>
	</div>
</template>

<script lang="ts" setup>
import { ref, reactive, toRefs } from 'vue'
import { ElTable } from 'element-plus'
let state = reactive({
	startRowIndex: null as any,
	endRowIndex: null as any,

})
let { startRowIndex, endRowIndex } = toRefs(state)
let isDragging = ref(false)
interface User {
	date: string
	name: string
	address: string
}

const multipleTableRef = ref<InstanceType<typeof ElTable>>()
const multipleSelection = ref<User[]>([])

const handleSelectionChange = (val: User[]) => {
	multipleSelection.value = val
}
const mousedownFn = (event: any) => {
	let cell = event?.target.closest('td')
	if (cell) {
		let rowIndex = cell.parentNode.rowIndex
		isDragging.value = true
		startRowIndex.value = rowIndex
		endRowIndex.value = rowIndex
	}
}
const handleMouseMove = (event: any) => {
	if (isDragging.value) {
		let cell = event.target.closest('td')
		if (cell) {
			let rowIndex = cell.parentNode.rowIndex
			endRowIndex.value = rowIndex
			let start = Math.min(startRowIndex.value, endRowIndex.value)
			let end = Math.max(startRowIndex.value, endRowIndex.value)
			for (let i = start; i <= end; i++) {
				multipleTableRef.value?.toggleRowSelection(tableData[i], true)
			}
		}
	}
}
const mouseupFn = () => {
	isDragging.value = false
}
const tableData: User[] = [
	{
		date: '2016-05-03',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-02',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-04',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-01',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-08',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-06',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-07',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-07',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-07',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-07',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-07',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-07',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-07',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},
	{
		date: '2016-05-07',
		name: 'Tom',
		address: 'No. 189, Grove St, Los Angeles',
	},

]
</script>

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值