表格拖拽:el-table 实现行拖拽排序 Sortable

element ui 表格实现拖拽排序的功能,可以借助第三方插件Sortablejs来实现。

1.引入sortablejs

npm install sortablejs --save
2.组件中引入
import Sortable from 'sortablejs';
<el-table
        ref="el-table"
        row-key="id"
        :data="tableData"
      >
</el-table>
注意:el-table一定要设置row-key,且row-key绑定的值唯一,不然拖拽可能乱序

3.拖拽方法
mounted() {
    this.initSort();
  },
  methods: {
    // 行拖拽
    initSort() {
      const el = this.$refs["el-table"].$el.querySelector(
        ".el-table__body-wrapper > table > tbody"
      );
      let _this = this;
      const ops = {
        animation: 200, //动画时长
        handle: ".el-table__row", //可拖拽区域class
        //拖拽中事件
        onMove: ({ dragged, related }) => {
          const oldRow = _this.tableData[dragged.rowIndex]; //旧位置数据
          const newRow = _this.tableData[related.rowIndex]; //被拖拽的新数据
        },
        //拖拽结束事件
        onEnd: (evt) => {
          const curRow = _this.tableData.splice(evt.oldIndex, 1)[0];
          _this.tableData.splice(evt.newIndex, 0, curRow);
        },
      };
      Sortable.create(el, ops);
    },
}

<think>好的,用户的问题是关于在Vue中使用el-tablesortable.js实现表格和列拖拽排序。我需要先理清用户的具体需求,然后结合提供的引用内容来组织答案。 首先,用户提到了和列拖拽排序,所以需要分别处理这两个部分。根据引用2和3,拖拽已经有实现方法,但列拖拽可能需要额外处理。我需要确认sortable.js是否支持列拖拽,或者是否有其他方法。 接下来,分析引用中的信息。引用2和3都提到了使用sortable.jsel-table实现拖拽,但列拖拽没有直接提到。可能需要使用类似的思路,但针对表头进操作。此外,引用1提到结合Vue 3和Element Plus,但用户可能使用的是Element UI,需要注意版本差异。 然后,我需要考虑具体的实现步骤。对于拖拽,应该是在tbody绑定Sortable实例,处理拖拽事件,并更新数据。列拖拽则需要操作thead中的th元素,同样使用Sortable,但需要处理列的重新排列和数据更新。 示例代码部分,需要提供和列拖拽的代码。拖拽的代码在引用2和3中有示例,可以借鉴。列拖拽可能需要创建一个新的Sortable实例,作用于表头元素,并在拖拽结束后更新列的顺序。 注意事项方面,需要注意Vue的响应式数据更新,避免直接操作DOM,而应该通过数据驱动视图。此外,在弹窗中使用时(如引用2提到的el-dialog),可能需要处理组件挂载的时机,确保DOM存在后再初始化Sortable。 另外,用户可能遇到的问题包括拖拽后数据未更新,或者样式问题。需要提醒在拖拽结束后同步数据,并处理可能的样式冲突,比如z-index或事件冒泡的问题。 最后,生成相关问题,需要围绕实现中的关键点,如性能优化、事件处理、兼容性等提出相关问题,帮助用户深入理解。 总结步骤: 1. 安装sortable.js 2. 拖拽:绑定tbody,处理拖拽事件,更新数据数组 3.拖拽:绑定thead,处理拖拽事件,更新列配置数组 4. 提供示例代码,包括和列的实现 5. 注意事项:数据同步、组件销毁、样式调整、弹窗中的初始化时机</think>### 分步解答:Vue实现el-table和列拖拽排序 --- #### **一、实现拖拽排序** 1. **安装依赖** ```bash npm install sortablejs --save ``` 2. **绑定表格元素** ```vue <template> <el-table :data="tableData" row-key="id" id="dragTable"> <el-table-column label="姓名" prop="name"></el-table-column> <el-table-column label="年龄" prop="age"></el-table-column> </el-table> </template> <script> import Sortable from 'sortablejs'; export default { data() { return { tableData: [ { id: 1, name: '张三', age: 25 }, { id: 2, name: '李四', age: 30 } ] }; }, mounted() { this.initRowSortable(); }, methods: { initRowSortable() { const tbody = document.querySelector('#dragTable tbody'); Sortable.create(tbody, { animation: 150, onEnd: (evt) => { // 同步数据顺序 const data = [...this.tableData]; const [movedRow] = data.splice(evt.oldIndex, 1); data.splice(evt.newIndex, 0, movedRow); this.tableData = data; } }); } } }; </script> ``` --- #### **二、实现拖拽排序** 1. **绑定表头元素** ```vue <template> <el-table :data="tableData" row-key="id" id="dragTable"> <el-table-column v-for="col in columns" :key="col.prop" :label="col.label" :prop="col.prop"></el-table-column> </el-table> </template> <script> export default { data() { return { columns: [ { label: '姓名', prop: 'name' }, { label: '年龄', prop: 'age' } ] }; }, mounted() { this.initColSortable(); }, methods: { initColSortable() { const thead = document.querySelector('#dragTable thead tr'); Sortable.create(thead, { animation: 150, onEnd: (evt) => { // 同步列顺序 const cols = [...this.columns]; const [movedCol] = cols.splice(evt.oldIndex, 1); cols.splice(evt.newIndex, 0, movedCol); this.columns = cols; } }); } } }; </script> ``` --- #### **三、注意事项** 1. **数据同步** 拖拽操作需通过Vue数据驱动视图更新,避免直接操作DOM[^2]。 2. **组件销毁** 在组件销毁时手动清理Sortable实例: ```javascript beforeUnmount() { if (this.rowSortable) this.rowSortable.destroy(); if (this.colSortable) this.colSortable.destroy(); } ``` 3. **弹窗中的使用** 若在`el-dialog`中使用,需在弹窗完全渲染后(如`mounted`或`open`事件)再初始化Sortable。 4. **样式调整** 拖拽时可能出现元素层级问题,可添加CSS: ```css .sortable-chosen { z-index: 9999 !important; } ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值