el-table & Sortable 行拖拽排序

ele-P 使用

1 el-table & Sortable

拖拽排序

依赖

npm i sortablejs --save
npm i @type/sortablejs --save-dev

ref && row-key

<el-table :data="oriTableData" ref="dragTable" row-key="seqNo"> </el-table>

导入依赖 && 初始化示例

import Sortable from 'sortablejs';

const dragTable = ref();  // 获取el-table的ref

// 初始化拖拽
const initDropTable = () => {
  const el = dragTable.value.$el.querySelector('.el-table__body-wrapper tbody') as any;
  Sortable.create(el, {
    animation: 500,
    sort: true,
    //拖拽结束后触发
    onEnd: (evt: any) => {
      setNodeSort(evt.oldIndex, evt.newIndex)
    }
  })
}
const setNodeSort = (oldIndex: any, newIndex: any) => {
  // 使用arr复制一份表格数组数据
  const arr = cloneDeep(oriTableData.value);
  const currentRow = arr.splice(oldIndex, 1)[0];
  arr.splice(newIndex, 0, currentRow );
  // 原数组置空
  oriTableData.value = [];
  nextTick(() => {
    oriTableData.value = arr.map((item, idx) => ({...item, order: idx + 1}));
  });
}
### 实现多列同时排序 为了实现在 `Element UI` 的 `el-table` 中多列可拖拽排序功能,可以借助于第三方库 `SortableJS` 来增强原生表格的为[^1]。通过自定义指令或组件封装的方式集成 `SortableJS` 到 `el-table` 中。 #### 安装依赖 首先安装必要的 npm 包: ```bash npm install vuedraggable sortablejs --save ``` #### 创建 draggable 指令 创建一个新的 Vue 插件来处理表内的拖动逻辑: ```javascript import Sortable from &#39;sortablejs&#39;; export default { bind(el, binding, vnode) { const { value } = binding; let children; new Sortable(el.querySelector(&#39;.el-table__body-wrapper tbody&#39;), { animation: 180, onEnd({ newIndex, oldIndex }) { const targetRow = value.splice(oldIndex, 1)[0]; value.splice(newIndex, 0, targetRow); // 更新视图中的数据源 vnode.context.$forceUpdate(); // 可选:发送新的顺序给服务器保存 console.log(&#39;New order:&#39;, value); } }); }, }; ``` 此插件会在每次拖放结束时触发回调函数,在该函数内部调整数组项的位置并强制刷新界面显示最新的排列状态[^3]。 #### 修改 el-table 组件模板结构 为了让每一列表头都具备拖拽能力,可以在每列上添加特定类名以便识别哪些列为可移动区域,并应用上述创建好的 directive: ```html &lt;template&gt; &lt;div id=&quot;app&quot;&gt; &lt;el-table :data=&quot;tableData&quot; @sort-change=&quot;handleSortChange&quot; v-dragsort=&quot;tableData&quot;&gt; &lt;!-- 假设这里有多个具有相同 class=&#39;draggable-column&#39; 类别的 column --&gt; &lt;el-table-column prop=&quot;name&quot; label=&quot;Name&quot; /&gt; &lt;el-table-column prop=&quot;age&quot; label=&quot;Age&quot;/&gt; ... &lt;/el-table&gt; &lt;/div&gt; &lt;/template&gt; &lt;script&gt; // 导入之前编写的 draggable.js 文件作为全局指令注册 Vue.directive(&#39;dragsort&#39;, require(&#39;./path/to/directive&#39;)); export default { data() { return { tableData: [ /* 初始化的数据 */ ] }; }, } &lt;/script&gt; ``` 需要注意的是,如果要让所有列都能被拖拽,则不需要特别指定哪一列是可拖拽的;但如果只想允许某些特定列参与排序操作的话,则应该只在这几列上面加上相应的 CSS 类选择器[^2]。 #### 处理多列排序后的事件响应 当用户完成一次或多列的同时拖拽后,可以通过监听 `@sort-change` 或者其他合适时机捕获到当前最新版的数据集变化情况,并据此执进一步的操作比如向后台提交新次序等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值