vue2 + vuedraggable实现卡片拖拽排序效果

本文介绍了如何在Vue项目中使用vuedraggable库实现列表项的拖拽排序,包括引入库、组件绑定和事件处理。作者提到原生Vue拖拽功能未深入研究,但vuedraggable易于上手且配合a-card卡片使用方便。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一下拖拽排序的方法,以后可能会用到,找了好多方法,最后用了 vuedraggable,看资料,vue也有原生的拖拽,这个没有看过,有时间会研究一下,原生的可能更简单(只是我想的)。但是vuedraggable也不难。网上也有很多资料。
直接上代码,全部的代码都在这了。
第一步,肯定是 npm i -S vuedraggable 啦
第二步 直接在页面引入。见下方代码

<template>
    <div class="draggable">
        <Draggable v-model="tableData" animation="500" @start="onStart" @end="onEnd">
            <a-card v-for="(item, index) in tableData" :key="index" class="ck-content-common">
                <p>{{item.name}}</p>
                <p>Card content</p>
                <p>Card content</p>
            </a-card>
        </Draggable>
    </div>
</template>
<script>
import Draggable from 'vuedraggable';
export default {
    components: { Draggable },
    data() {
        return {
            tableData: [
                {
                    name: '0',
                    test: '0'
                },
                {
                    name: '1',
                    test: '1'
                },
                {
                    name: '2',
                    test: '2'
                },
                {
                    name: '3',
                    test: '3'
                },
                {
                    name: '4',
                    test: '4'
                },
                {
                    name: '5',
                    test: '5'
                },
                {
                    name: '6',
                    test: '6'
                },
                {
                    name: '7',
                    test: '7'
                },
                {
                    name: '8',
                    test: '8'
                },
                {
                    name: '9',
                    test: '9'
                }
            ]
        };
    },
    methods: {
        onStart({item,oldIndex}) {
            console.log('开始拖拽',item,oldIndex);
            console.log('原来的数据',this.tableData)
        },
        onEnd({item,newIndex}) {
            console.log('结束拖拽',item,newIndex);
            console.log('之后的数据',this.tableData)
        }
    }
};
</script>
<style scoped>
.draggable {
    width: 100%;
    height: 100%;
    padding: 20px;
    display: flex;
    flex-direction: row;
}
.ck-content-common {
    border: 1px solid #e8e8e8;
    display: inline-block;
    margin: 10px;
}
</style>

vuedraggable 的属性,可以自己研究一下,中文文档:https://www.itxst.com/vue-draggable/tutorial.html
这个主要还是想和 a-card 卡片结合起来用

### Vue2 实现卡片拖拽功能示例代码 在 Vue2实现卡片拖拽功能,可以通过自定义指令或事件监听器来完成。以下是基于引用内容和相关知识的完整示例代码。 ```vue <template> <div id="app"> <div class="card" v-draggable :style="{ left: cardPosition.left + 'px', top: cardPosition.top + 'px' }" > <p>这是卡片的内容</p> </div> </div> </template> <script> export default { data() { return { cardPosition: { left: 100, top: 100 }, // 卡片初始位置 }; }, directives: { draggable(el) { let isDragging = false; let startX, startY, initialX, initialY; el.onmousedown = (e) => { isDragging = true; startX = e.clientX; // 鼠标按下时的X坐标 startY = e.clientY; // 鼠标按下时的Y坐标 initialX = el.offsetLeft; // 元素当前的left值 initialY = el.offsetTop; // 元素当前的top值 }; document.onmousemove = (e) => { if (!isDragging) return; const deltaX = e.clientX - startX; // 计算鼠标移动的距离 const deltaY = e.clientY - startY; el.style.left = `${initialX + deltaX}px`; // 更新元素的位置 el.style.top = `${initialY + deltaY}px`; }; document.onmouseup = () => { isDragging = false; }; }, }, }; </script> <style> .card { width: 200px; height: 150px; background-color: #f0f0f0; border: 1px solid #ccc; position: absolute; cursor: move; padding: 10px; box-sizing: border-box; } </style> ``` ### 说明 1. 在上述代码中,通过自定义指令 `v-draggable` 实现卡片拖拽功能[^4]。 2. 指令内部使用了 `onmousedown`、`onmousemove` 和 `onmouseup` 事件来捕获鼠标动作,并计算卡片的新位置[^3]。 3. 卡片的初始位置由 `data` 中的 `cardPosition` 属性控制,确保卡片可以动态调整位置[^1]。 ### 注意事项 - 确保在项目中正确引入 Vue2,并且支持自定义指令。 - 如果需要支持多个卡片拖拽,可以将 `cardPosition` 替换为数组或对象形式,存储每个卡片的位置信息[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值