Vue项目使用Sortable.js实现拖拽功能

本文详细讲解了如何通过NPM安装Sortable.js并在Vue项目中实现拖拽功能,包括组件导入、数据结构和方法实现,以及不同状态下的效果展示。

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

想了解更多-可前往 Sortable.js官网 查看组件属性及参数

安装组件(我这里使用的是NPM安装)
 npm install sortablejs --save
在需要使用拖拽功能的页面中使用(完整功能代码)
<div class="tag_box">
    <div class="drag"  v-for="(item,index) in taglist" :key="index">{{item.name}}</div>
</div>
import Sortable from "sortablejs";
export default {
    data() {
        return {
            taglist:[
                {
                    id:1,
                    name:'型号'
                },{
                    id:2,
                    name:'产牌'
                },{
                    id:3,
                    name:'价格'
                },{
                    id:4,
                    name:'批次'
                },{
                    id:6,
                    name:'有效期'
                },{
                    id:5,
                    name:'描述'
                }]
        }
    },
    methods: {
        async rowDrop() {
            const that = this
            const tbody = document.querySelector(".tag_box");//绑定对应拖拽的父元素
            const sortable = Sortable.create(tbody, {
                animation: 150, //动画
                disabled: false, // 拖拽不可用? false 启用(刚刚渲染表格的时候起作用,后面不起作用)
                handle: ".drag", //指定拖拽目标,点击此目标才可拖拽元素(此例中设置操作按钮拖拽)
                chosenClass: "sortable-chosen",
                filter: ".disabled", //指定不可拖动的类名(el-table中可通过row-class-name设置行的class)
                onEnd: evt => {  //监听拖动结束事件
                    let proId = that.id; //就是我们上面获取到当前行的id值
                    console.log(evt.oldIndex) //当前行的被拖拽前的顺序
                    console.log(evt.newIndex) //当前行的被拖拽后的顺序
                    // 这里就可以写我们需要传给后台的逻辑代码
                    // that.changlistsort(evt.oldIndex, evt.newIndex)
                }
            })
        },
    },
    mounted() {
        this.rowDrop()
    },
    components: {
        Sortable
    }
}

最终效果如下

一、拖拽前

拖拽前

一、拖拽中

拖拽中

一、拖拽后

拖拽后

### Vue2 中使用 Sortable.js 实现 Element UI 的 el-table 组件拖动行功能并保持序号不变 为了在 Vue2 项目中通过 `Sortable.js` 实现 `el-table` 行拖拽排序的功能,同时确保表格中的序号不会因拖拽而改变,可以按照以下方式实现。 #### 主要思路 1. 使用 `Sortable.js` 提供的 API 来监听拖拽事件。 2. 在数据模型层面更新数组顺序以同步视图变化。 3. 添加一个独立字段用于存储原始索引值,在渲染时利用该字段来显示固定的序号[^1]。 以下是具体实现: ```javascript <template> <div> <el-table :data="tableData" border style="width: 100%"> <!-- 定义一列表格序号 --> <el-table-column type="index" label="#" width="50"></el-table-column> <el-table-column prop="name" label="名称" width="180"></el-table-column> <el-table-column prop="age" label="年龄"></el-table-column> </el-table> <!-- 可选:添加一个隐藏 DOM 节点作为 Sortable 初始化目标 --> <tr ref="dragHandle" class="hidden-drag-handle"> <td></td><td></td><td></td> </tr> </div> </template> <script> import Sortable from 'sortablejs'; export default { data() { return { tableData: [ { name: '张三', age: 24 }, { name: '李四', age: 30 }, { name: '王五', age: 27 } ] }; }, mounted() { this.initSortable(); }, methods: { initSortable() { const elTableBody = this.$refs.dragHandle || document.querySelector('.el-table__body-wrapper tbody'); new Sortable(elTableBody, { animation: 150, handle: '.handle', // 如果有自定义手柄类名,则在此指定 onEnd: (evt) => { const oldIndex = evt.oldIndex; const newIndex = evt.newIndex; // 更新数据源顺序 const movedItem = this.tableData.splice(oldIndex, 1)[0]; this.tableData.splice(newIndex, 0, movedItem); } }); } } }; </script> <style scoped> .hidden-drag-handle { display: none; /* 隐藏辅助节点 */ } .handle { cursor: move; /* 自定义手柄样式 */ } </style> ``` #### 关键点解析 - **初始化 Sortable** 将 `Sortable.create()` 方法绑定到 `.el-table__body-wrapper tbody` 上,这是实际承载表格主体的部分。如果需要更精确的选择器,可以通过 `$refs` 或者动态查询获取对应的 DOM 元素。 - **onEnd 回调函数** 当用户完成拖拽操作后触发此回调。通过调整原生 JavaScript 数组的方法(如 `splice`),重新排列内部的数据结构,从而让前端展示的内容与逻辑一致[^1]。 - **固定序号处理** 利用 `<el-table-column>` 的内置属性 `type="index"` 自动生成基于当前页面分页后的连续编号;或者手动维护额外的一个字段记录初始位置,并将其映射至界面层面上呈现给用户的视觉效果。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Frontend-Arway

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值