Skip to content

基本用法

基本的拖拽排序代码,复制运行后可直观的看到效果,复杂样式直接自己需求编写item样式即可

长按拖拽

v-model绑定需拖拽集合,columns为集合显示列数,item-height为拖拽元素高度 单位是pxitem-margin为元素之间的空隙,custom-class为自定义item的class,同时绑定了@start、@update、@end事件,分别在拖拽开始时、拖拽发生改变时、拖拽结束时触发。

注意

v-model绑定的对象数组内需包含唯一标识,默认为id,如需更换则指定item-key即可。

<template>
	<su-drag
		v-model="dataList"  
		:columns="4" 
		:item-height="100"
		item-margin="2px"
		custom-class="custom-class"
		@start="start"
		@update="update"
		@end="end"
	>
		<template #default={data}>
			{{data.name}}
		</template>
	</su-drag>
</template>
<script setup>
	import { ref, watch } from 'vue';
	
	const dataList = ref([
		{id: 1, name: 'a'},
		{id: 2, name: 'b'},
		{id: 3, name: 'c'},
		{id: 4, name: 'd'},
		{id: 5, name: 'e'},
		{id: 6, name: 'f'},
		{id: 7, name: 'g'},
		])

	function start(event, index) {
		console.log("start", event, index);
	}
	function update(event, index) {
		console.log("update", event, index);
		
	}
	function end(event, index) {
		console.log("end", event, index);
	}
</script>
<style lang="scss" scoped>
	:deep() {
		.custom-class {
			background-color: greenyellow;
			text-align: center;
			line-height: 100px;
		}
	}
</style>

API控制拖拽

添加 touch-dragging调整为触摸拖拽,然后可通过 switchDragging()方法可实时控制拖拽的开启与关闭

<template>
	<view style="margin: 10px; display: flex; align-items: center; justify-content: space-around;">
		<text style="font-size: 18px;">API启用/关闭拖拽: </text>
		<button v-if="dragging" type="warn" @click="triggerDrag(false)" size="mini">关闭拖拽</button>
		<button v-else type="primary" @click="triggerDrag(true)" size="mini">开启拖拽</button>
	</view>
	
	<su-drag ref="sudrag"
		v-model="dataList"  
		:columns="4" 
		:item-height="100"
		item-margin="2px"
		custom-class="custom-class"
		touch-dragging
	>
		<template #default={data}>
			{{data.name}}
		</template>
	</su-drag>
</template>
<script setup>
	import { ref, watch } from 'vue';
	const dragging = ref(false)
	const sudrag = ref(null)
	
	const dataList = ref([
		{id: 1, name: 'a'},
		{id: 2, name: 'b'},
		{id: 3, name: 'c'},
		{id: 4, name: 'd'},
		{id: 5, name: 'e'},
		{id: 6, name: 'f'},
		{id: 7, name: 'g'},
	])
		
	function triggerDrag(value) {
		dragging.value = value
		sudrag.value?.switchDragging(value)
	}
</script>
<style lang="scss" scoped>
	:deep() {
		.custom-class {
			background-color: greenyellow;
			text-align: center;
			line-height: 100px;
		}
	}
</style>

固定元素

对象内包含fixed且等于true时,该元素会固定不可拖拽,且不与其他元素交换位置

const dataList = ref([
	{id: 1, name: 'a', fixed: true},
	{id: 2, name: 'b'},
	{id: 3, name: 'c'},
	{id: 4, name: 'd'},
	{id: 5, name: 'e'},
	{id: 6, name: 'f', fixed: true},
	{id: 7, name: 'g'},
])

新增/删除元素

通过deleteItemaddItemAPI删除或新增元素,不可直接增删数组内元素

注意

deleteItem删除元素并非物理删除,只是给删除元素标记了delete: true,如果您的dataList在别处用到时注意过滤

function deleteItem() {
	// sudrag.value?.deleteItem(2)
	sudrag.value?.deleteItem([2, 3])
}

function addItem(){
	sudrag.value?.addItem({id: Math.max(...dataList.value.map(item => item.id)) + 1, name: "新增"})
}

Attributes

参数说明类型默认值备注
v-model拖拽元素集合Array-
columns列数Number0
item-height元素高度Number0单位px,不传则高度由内容撑开
item-key元素唯一标识字段Stringid
item-margin元素间距String0px
sort-field排序字段(排序时操作的字段)Stringsort
custom-class拖拽元素class类String-
custom-after-class拖拽元素后插槽class类String-
custom-drag-class元素触发拖拽时的class类String-
custom-fixed-class固定元素的class类String-
touch-dragging关闭长按拖拽
使用API控制拖拽开启/关闭
Booleanfalse
scrolling-threshold拖拽触底/触顶滚动阈值Number85单位px

Events

事件名称说明参数
start拖拽开始时event, index
update元素位置发生改变时event, index
end拖拽结束时event, index
height-change拖拽父元素高度发生改变时wrapHeight

Slot

name说明
default默认插槽default={data},data为当前元素里的数据
after最后一个拖拽元素后的自定义内容,通常可用于放添加按钮

API方法

方法名参数说明
addItem{}添加的元素对象
deleteItem[1, 2] | 1需删除元素唯一标识/唯一标识数组
init-重新初始化拖拽元素位置信息,在su-drag上方,如有高度不固定的元素,需在上方元素高度变化后调用该方法,重新获取位置信息
switchDraggingtrue | false开启|关闭拖拽,长按拖拽模式下不生效