el-table 实现行拖拽排序

切记必须使用row-key="id"必须添加,必须添加,必须添加不然会排序错乱

             <el-table 
              ref="multipleTable" 
              row-key="id"
              :data="tableData" @current-change="handleCurrentChange">
                <el-table-column
                  type="index"
                  label="序号"
                  align="center"
                  width="50"
                ></el-table-column>
                <el-table-column
                  prop="cruisePlace"
                  align="center"
                  label="项目位置"
                  width="500"
                />
               <el-table>
  methods: {
  // 行拖拽
    rowDropInit() {
        // 获取行容器
        /* 1、this.$refs.multipleTable:访问 Vue 组件中名为 multipleTable 的引用,通常用于获取某个子组件或 DOM 元素。
        2、.$el:获取这个引用的根 DOM 元素*/
        const wrapperRow = this.$refs.multipleTable.$el.querySelector(
            ".el-table__body-wrapper tbody"
        );
        const that = this; // 存一份指向
        // 给行容器指定对应拖拽规则
        Sortable.create(wrapperRow, {
            animation: 150, // 设置动画时间
            onEnd({ newIndex, oldIndex }) {
                const newData = [...that.tableData]; // 创建新数组
                const currRow = newData.splice(oldIndex, 1)[0]; // 删除原位置的行
                newData.splice(newIndex, 0, currRow); // 插入到新位置
                that.tableData = newData; // 更新数据
            }
        });
    },
}
  mounted() {
    this.$nextTick(()=>{
       this.rowDropInit();
    })

  },

el-table实现拖拽排序,可以通过以下步骤来实现: 1. 首先,确保你已经引入了element-ui库,并正确使用了el-table组件。 2. 在el-table中,给需要排序的列添加一个自定义的拖拽排序指令。可以使用vuedraggable或其他类似的拖拽库来实现。 3. 在自定义指令中,监听拖拽事件,获取拖拽的起始位置和目标位置。 4. 根据起始位置和目标位置,更新数据源中对应的数据项的顺序。 5. 在el-table中使用v-for指令遍历数据源,确保数据项的顺序与数据源一致。 下面是一个简单的示例代码: ```html <template> <el-table :data="tableData"> <el-table-column label="姓名" prop="name"> <template slot-scope="scope"> <div v-drag-sort class="drag-handle">{{ scope.row.name }}</div> </template> </el-table-column> <el-table-column label="年龄" prop="age"></el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', age: 20 }, { name: '李四', age: 25 }, { name: '王五', age: 30 }, ], }; }, directives: { dragSort: { bind(el, binding, vnode) { const dragHandle = el.querySelector('.drag-handle'); dragHandle.addEventListener('dragstart', (event) => { event.dataTransfer.setData('text/plain', vnode.key); }); el.addEventListener('dragover', (event) => { event.preventDefault(); }); el.addEventListener('drop', (event) => { event.preventDefault(); const sourceKey = event.dataTransfer.getData('text/plain'); const targetKey = vnode.key; const sourceIndex = vnode.context.tableData.findIndex((item) => item.name === sourceKey); const targetIndex = vnode.context.tableData.findIndex((item) => item.name === targetKey); if (sourceIndex > -1 && targetIndex > -1) { const [removed] = vnode.context.tableData.splice(sourceIndex, 1); vnode.context.tableData.splice(targetIndex, 0, removed); } }); }, }, }, }; </script> ``` 这样,你就可以在el-table实现拖拽排序了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值