Vue.Draggable使用nested-with-vmodel进行拖拽

devtools/2024/11/28 0:06:13/

Vue.Draggable使用nested-with-vmodel进行拖拽

1. 介绍

‌draggable‌是一个基于Sortable.js的Vue组件,用于实现拖拽功能。它支持触摸设备、拖拽和选择文本、智能滚动、不同列表之间的拖拽等功能,并且与Vue的视图模型同步刷新,兼容Vue2的过渡动画,支持撤销操作,并且可以与现有的UI组件兼容‌。

2. 官网地址

nested-with-vmodel拖拽

3. 安装

npm install vuedraggable

或者

pnpm install vuedraggable

4. NestedVmodel.vue组件

<script lang="ts">javascript">
import { defineComponent, PropType } from "vue";
import draggable from "vuedraggable";export default defineComponent({name: "NestedVmodel",components: {draggable},props: {list: {type: Array as PropType<Array<{ id: number; name: string; elements: Array<any> }>>,required: true}},emits: ["update:modelValue"],setup(props, { emit }) {const dragOptions = {animation: 200,group: "description",disabled: false,ghostClass: "ghost"};const emitter = (value: any) => {emit("update:modelValue", value);};const updateChildList = (parentId: number, updatedList: any) => {const updatedElements = props.list.map(el => {if (el.id === parentId) {return { ...el, elements: updatedList };}return el;});emitter(updatedElements);};const getUpdatedList = () => {return props.list;};return {dragOptions,emitter,updateChildList,getUpdatedList};}
});
</script>
<template><draggablev-bind="dragOptions"tag="div"class="item-container":list="list"item-key="id"@update:modelValue="emitter"><template #item="{ element }"><div :key="element.id" class="item-group"><div class="item">{{ element.name }}</div><nested-vmodelclass="item-sub":list="element.elements"@update:modelValue="updateChildList(element.id, $event)"/></div></template></draggable>
</template><style scoped lang="scss">
.item-container {box-sizing: border-box;max-width: 100%;padding: 0.75rem;margin: 0 auto;background-color: #f8f9fa;border-bottom-right-radius: 8px;border-bottom-left-radius: 8px;box-shadow: 0 4px 8px rgb(0 0 0 / 10%);
}.item-group {margin-bottom: 1rem;
}.item {padding: 0.5rem;cursor: pointer;background-color: #fff;border: 1px solid #ddd;border-radius: 6px;box-shadow: 0 2px 4px rgb(0 0 0 / 5%);transition: box-shadow 0.2s ease;
}.item:hover {box-shadow: 0 4px 8px rgb(0 0 0 / 10%);
}.item-sub {border-left: 2px dashed #bbb;
}.ghost {background-color: #e9ecef;opacity: 0.6;
}
</style>

5. 如何使用(示例代码)

<script lang="ts" setup>javascript">
import { ref, onMounted } from "vue";
import nestedVmodel from "@/components/ReTools/NestedVmodel.vue";// 拖拽列表数据
const dragList = ref([]);
const nestedTestRef = ref(null);// 获取数据逻辑
const getPromptGroup = async () => {// 获取数据的逻辑dragList.value = [{id: 4,name: "Lord Farquad",elements: []},{id: 1,name: "Shrek",elements: [{id: 5,name: "Prince Charming",elements: [{id: 3,name: "Donkey",elements: [{id: 2,name: "Fiona",elements: []}]}]}]}];
};const handleUpdate = newList => {dragList.value = newList;
};const getList = () => {if (nestedTestRef.value) {return nestedTestRef.value.getUpdatedList();}
};// 在组件挂载时加载数据
onMounted(async () => {if (dragList.value.length === 0) {await getPromptGroup();}
});
// 将 getList 方法暴露给父组件
defineExpose({getList
});
</script><template><nested-vmodelref="nestedTestRef":list="dragList"@update:modelValue="handleUpdate"/>
</template>

6. 页面效果(随意拖拽)

在这里插入图片描述

在这里插入图片描述

7. 弹窗打开获取数据

function openDraggableDialog(row?: ApiProps) {addDialog({title: "###",props: {},width: "40%",draggable: true,fullscreenIcon: true,closeOnClickModal: false,contentRenderer: () => h(draggable, { ref: draggableRef }),beforeSure: done => {if (draggableRef.value) {const updatedList = draggableRef.value.getList();}}});}

http://www.ppmy.cn/devtools/137520.html

相关文章

标贝科技大模型声音复刻 快速获取高品质专属AI声音

这两天&#xff0c;科技界发生了一件炸裂的事情——代表科技最高峰的诺贝尔物理学奖&#xff0c;居然颁给了两位人工智能领域的科学家&#xff0c;约翰霍普菲尔德和杰弗里辛顿。他们在机器学习和人工神经网络领域的开创性研究&#xff0c;不仅为现代机器学习奠定了基础&#xf…

TCP IP协议和网络安全

传输层的两个协议&#xff1a; 可靠传输 TCP 分段传输 建立对话&#xff08;消耗系统资源&#xff09; 丢失重传netstat -n 不可靠传输 UDP 一个数据包就能表达完整的意思或屏幕广播 应用层协议&#xff08;默认端口&#xff09;&#xff1a; httpTCP80 网页 ftpTCP21验证用户身…

Unity图形学之BRDF双向反射分布函数

1.描述了入射光线在非透明物体表面如何进行反射&#xff0c;也就是说多少光发生了漫反射&#xff0c;多少光发生了镜面反射 BRDF 函数计算的是“特定反射方向的光强与入射光强的比例” 2.各向异性 与 均向性 相反&#xff0c;是指在不同方向具有不同行为的性质&#xff0c;也就…

Lock锁和AQS之间的关系与区别:基于第一原理的深入分析

引言 在Java并发编程中&#xff0c;锁&#xff08;Lock&#xff09;和队列同步器&#xff08;AbstractQueuedSynchronizer&#xff0c;简称AQS&#xff09;是两个核心概念。它们为多线程环境下的同步和互斥提供了强大的支持。本文将从第一原理出发&#xff0c;深入探讨Lock锁和…

springboot配置https,并使用wss

学习链接 springboot如何将http转https SpringBoot配置HTTPS及开发调试 Tomcat8.5配置https和SpringBoot配置https 可借鉴的参考&#xff1a; springboot如何配置ssl支持httpsSpringBoot配置HTTPS及开发调试的操作方法springboot实现的https单向认证和双向认证(java生成证…

【Rust Iterator 之 fold,map,filter,for_each】

Rust Iterator 之 fold,map,filter,for_each 前言mapfor_each通过源码看for_each foldfilter总结 前言 在Iterator 一文中&#xff0c;我们提到过Iterator时惰性的&#xff0c;也就是当我们将容器转换成迭代器时不会产生任何的迭代行为&#xff0c;所以在使用时开发者还需要将…

Spring Boot与林业产品推荐系统的融合

2 系统开发技术 这部分内容主要介绍本系统使用的技术&#xff0c;包括使用的工具&#xff0c;编程的语言等内容。 2.1 Java语言 Java语言自公元1995年至今&#xff0c;已经超过25年了&#xff0c;依然在软件开发上面有很大的市场占有率。当年Sun公司发明Java就是为了发展一门跨…

Code Review 指导方针

优质博文&#xff1a;IT-BLOG-CN Why Code Review? - 为什么要进行代码评审&#xff1f; Code Review是软件开发过程中的一个关键实践,它有以下几个重要目的: Improve Code Quality- 改进代码质量 【1】确保代码符合团队的编码标准、最佳实践和设计原则。 【2】识别并修正可…