vue使用sortablejs进行表格和div的拖拽

npm install sortablejs --save
<template>
    <div class="draggable">
        <h1>拖动表格</h1>
        <el-table :cell-class-name="tableRowClassName" :data="tableData" style="width: 100%" row-key="date">
            <el-table-column prop="date" label="序号" width="180">
            </el-table-column>
            <el-table-column prop="name" label="姓名" width="180">
            </el-table-column>
            <el-table-column prop="address" label="地址">
            </el-table-column>
        </el-table>
        <h1>拖动盒子</h1>
        <div class="draggableDiv">
            <div class='smallBox' v-for="item in boxList" :key="item">{{item}}</div>
        </div>
    </div>
</template>

<script>
import Sortable from 'sortablejs';
export default {
    data() {
        return {
            tableData: [{
                date: '1',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1518 弄'
            }, {
                date: '2',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1517 弄'
            }, {
                date: '3',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1519 弄'
            }, {
                date: '4',
                name: '王小虎',
                address: '上海市普陀区金沙江路 1516 弄'
            }],
            boxList: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
        };
    },
    created() {

    },
    mounted() {
        this.rowDrop();
        this.boxDrop();
    },
    methods: {
        tableRowClassName({rowIndex}) {
            if (rowIndex == 1) {
                return 'warning-row';
            } else if (rowIndex == 2) {
                return 'error-row';
            }
            return '';
        },
        //行拖拽
        rowDrop() {
            let tbody = document.querySelector('.draggable .el-table__body-wrapper tbody');
            let _this = this;
            Sortable.create(tbody, {
                //  指定父元素下可被拖拽的子元素
                draggable: ".draggable .el-table__row",
                onEnd({ newIndex, oldIndex }) {
                    const currRow = _this.tableData.splice(oldIndex, 1)[0];
                    _this.tableData.splice(newIndex, 0, currRow);
                    console.log('---', _this.tableData);
                }
            });
        },
        //盒子拖拽
        boxDrop() {
            let tbody = document.querySelector('.draggableDiv');
            let _this = this;
            Sortable.create(tbody, {
                //  指定父元素下可被拖拽的子元素
                draggable: ".draggableDiv .smallBox",
                onEnd({ newIndex, oldIndex }) {
                    const currRow = _this.boxList.splice(oldIndex, 1)[0];
                    _this.boxList.splice(newIndex, 0, currRow);
                    console.log('---', _this.boxList);
                }
            });
        }
    }
};
</script>

<style scoped lang="scss">
::v-deep .el-table .warning-row {
    background: #e6a23c !important;
    color: white;
}

::v-deep .el-table .error-row {
    background: #f56c6c !important;
    color: white;
}
.draggableDiv {
    display: flex;
    flex-wrap: wrap;
    .smallBox {
        width: 100px;
        height: 100px;
        border: 1px solid red;
        margin-right: 20px;
        margin-bottom: 20px;
    }
}
</style>


Vue 2中,要使用SortableJS插件对表格内的数据项进行拖拽排序并添加点击事件,首先你需要安装SortableJS库以及Vue-Sortable-Table组件(如果你还没有安装的话)。你可以通过npm或yarn进行安装: ```bash npm install sortablejs @vue/sortable-table # 或者 yarn add sortablejs @vue/sortable-table ``` 接下来,创建一个SortableTable组件,并在其中绑定SortableJS实例。同时,设置`handleClick`函数监听点击事件: ```html <template> <div> <table :sortable="options" @click="handleClick"> <!-- 表格列和 --> <tr v-for="(item, index) in items" :key="index"> <!-- 数据项和拖拽操作 --> <td contenteditable="true" :class="{ dragged: draggingItem === item }" @mousedown.prevent="startDrag(item)" @mouseup="endDrag(item)"> {{ item.value }} </td> <!-- 点击事件处理 --> <td @click="onRowClick(item)">点击</td> </tr> </table> </div> </template> <script> import Sortable from 'sortablejs'; export default { data() { return { items: [], // 初始化的数据数组 draggingItem: null, options: { group: '__items__', // 组名 animation: 150, // 动画效果时间 onSortEnd: (evt) => { this.updateOrder(evt.newIndex, evt.oldIndex); }, }, }; }, methods: { startDrag(item) { this.draggingItem = item; }, endDrag(item) { this.draggingItem = null; }, updateOrder(newIndex, oldIndex) { const newItems = [...this.items]; [newItems[newIndex], newItems[oldIndex]] = [newItems[oldIndex], newItems[newIndex]]; this.items = newItems; }, handleClick(item) { console.log('点击了第', item.index, ''); // 这里可以根据需要处理点击事件 }, onRowClick(item) { this.handleClick(item); }, }, }; </script> ``` 在这个例子中,`handleClick`函数会在点击数据项时打印日志,你可以根据需求自定义这个功能。注意要在组件内部注册Sortable实例,并在`@click`事件上监听`onRowClick`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值