element ui 表格没有自带的拖拽排序的功能,只能借助第三方插件 Sortablejs 来实现,先来看一下动态图,效果是不是你们想要的。
首先需要安装 Sortable.js
npm install sortablejs --save
然后引用
import Sortable from ‘sortablejs’
需要注意的是 element table 务必指定 row-key,row-key 必须是唯一的,如 ID,不然会出现排序不对的情况。
示例代码
| <template> | |
|   <div style="width:800px"> | |
|     <el-table :data="tableData" | |
|       border | |
| row-key="id" | |
| align="left"> | |
|      <el-table-column v-for="(item, index) in col" | |
| :key="`col_${index}`" | |
| :prop="dropCol[index].prop" | |
| :label="item.label"> | |
|       </el-table-column> | |
|     </el-table> | |
|     <pre style="text-align: left"> | |
|     </pre> | |
|     <hr> | |
|     <pre style="text-align: left"> | |
|     </pre> | |
|   </div> | |
| </template> | |
| <script> | |
| import Sortable from 'sortablejs' | |
| export default { | |
| data() { | |
| return { | |
| col: [ | |
|         { | |
| label: '日期', | |
| prop: 'date' | |
| }, | |
|         { | |
| label: '姓名', | |
| prop: 'name' | |
| }, | |
|         { | |
| label: '地址', | |
| prop: 'address' | |
|         } | |
| ], | |
| dropCol: [ | |
|         { | |
| label: '日期', | |
| prop: 'date' | |
| }, | |
|         { | |
| label: '姓名', | |
| prop: 'name' | |
| }, | |
|         { | |
| label: '地址', | |
| prop: 'address' | |
|         } | |
| ], | |
| tableData: [ | |
|         { | |
| id: '1', | |
| date: '2016-05-02', | |
| name: '王小虎1', | |
| address: '上海市普陀区金沙江路 100 弄' | |
| }, | |
|         { | |
| id: '2', | |
| date: '2016-05-04', | |
| name: '王小虎2', | |
| address: '上海市普陀区金沙江路 200 弄' | |
| }, | |
|         { | |
| id: '3', | |
| date: '2016-05-01', | |
| name: '王小虎3', | |
| address: '上海市普陀区金沙江路 300 弄' | |
| }, | |
|         { | |
| id: '4', | |
| date: '2016-05-03', | |
| name: '王小虎4', | |
| address: '上海市普陀区金沙江路 400 弄' | |
|         } | |
|       ] | |
|     } | |
| }, | |
| mounted() { | |
| this.rowDrop() | |
| this.columnDrop() | |
| }, | |
| methods: { | |
|     // 行拖拽 | |
| rowDrop() { | |
| const tbody = document.querySelector('.el-table__body-wrapper tbody') | |
| const _this = this | |
| Sortable.create(tbody, { | |
| onEnd({ newIndex, oldIndex }) { | |
| const currRow = _this.tableData.splice(oldIndex, 1)[0] | |
| _this.tableData.splice(newIndex, 0, currRow) | |
|         } | |
| }) | |
| }, | |
|     // 列拖拽 | |
| columnDrop() { | |
| const wrapperTr = document.querySelector('.el-table__header-wrapper tr') | |
| this.sortable = Sortable.create(wrapperTr, { | |
| animation: 180, | |
| delay: 0, | |
| onEnd: evt => { | |
| const oldItem = this.dropCol[evt.oldIndex] | |
| this.dropCol.splice(evt.oldIndex, 1) | |
| this.dropCol.splice(evt.newIndex, 0, oldItem) | |
|         } | |
| }) | |
|     } | |
|   } | |
| } | |
| </script> | |
| <style scoped> | |
| </style> | 
