vue3拖拽排序 使用 vuedraggable

vue.draggable.next vue3 拖拽排序

vue.draggable.next

下载

js 复制代码
pnpm add vuedraggable@next

使用

js 复制代码
<script lang="ts" setup>
import { reactive } from "vue";
import draggable from "vuedraggable";

const list = reactive([
	{
		id: 1,
		name: "zs",
	},
	{
		id: 2,
		name: "ls",
	},
	{
		id: 3,
		name: "xr",
	},
]);
</script>

<template>
	<draggable :list="list" item-key="id">
		<template #item="{ element }">
			<div>{{ element.name }}</div>
		</template>
	</draggable>
</template>

<style lang="scss" scoped></style>

slot 其他插槽

Header/Footer

可用作图片上传的按钮,保持在同一行

js 复制代码
<template>
	<draggable :list="list" item-key="id">
      <template #header>
         <button>Add</button>
      </template>

		<template #item="{ element }">
			<div>{{ element.name }}</div>
		</template>

      <template #Footer>
         <button>Add</button>
      </template>
	</draggable>
</template>

handle 手柄,指定某一元素可拖拽

js 复制代码
<template>
	<draggable :list="myArray" item-key="id" handle=".handle">
		<template #item="{ element, index }">
			<div>
				<span class="handle">点我拖动</span>
				<span class="px-20px">{{ element.name }}</span>
				<span @click="handleDelete(index)">X</span>
			</div>
		</template>
	</draggable>
</template>

animation 拖拽动画时长

js 复制代码
<template>
	<draggable :list="myArray" item-key="id" :animation="2000">
		<template #item="{ element }">
			<div>{{ element.name }}</div>
		</template>
	</draggable>
</template>

change 事件

js 复制代码
<script lang="ts" setup>
import { reactive } from "vue";
import draggable from "vuedraggable";
interface List {
	id: number;
	name: string;
}
const list: List[] = reactive([
	{
		id: 1,
		name: "zs",
	},
	{
		id: 2,
		name: "ls",
	},
	{
		id: 3,
		name: "xr",
	},
]);

function onChange(e: { moved: { element: List; newIndex: number; oldIndex: number } }) {
	console.log("拖拽元素", e.moved.element);
	console.log("拖拽元素后索引", e.moved.newIndex);
	console.log("拖拽元素前索引", e.moved.oldIndex);
}
</script>

<template>
	<draggable :list="list" item-key="id" @change="onChange">
		<template #item="{ element }">
			<div>{{ element.name }}</div>
		</template>
	</draggable>
</template>

<style lang="scss" scoped></style>
相关推荐
Crystal32814 分钟前
App端用户每日弹出签到弹窗如何实现?(uniapp+Vue)
前端·vue.js
摸着石头过河的石头15 分钟前
Service Worker 深度解析:让你的 Web 应用离线也能飞
前端·javascript·性能优化
molly cheung21 分钟前
Vue3:watch与watchEffect的异同
vue.js·watch·store·watcheffect
不爱吃糖的程序媛1 小时前
Electron 如何判断运行平台是鸿蒙系统(OpenHarmony)
javascript·electron·harmonyos
Hilaku1 小时前
我用AI重构了一段500行的屎山代码,这是我的Prompt和思考过程
前端·javascript·架构
Cxiaomu1 小时前
React Native App 自动检测版本更新完整实现指南
javascript·react native·react.js
掘金安东尼2 小时前
前端周刊第439期(2025年11月3日–11月9日)
前端·javascript·vue.js
有蝉2 小时前
vue-office——支持多种文件(docx、excel、pdf)预览的vue组件库,支持vue2/3。也支持非Vue框架的预览。
vue.js·pdf·excel
起这个名字3 小时前
微前端应用通信使用和原理
前端·javascript·vue.js
QuantumLeap丶3 小时前
《uni-app跨平台开发完全指南》- 06 - 页面路由与导航
前端·vue.js·uni-app