009:vue结合el-table实现表格行拖拽排序(基于sortablejs)

文章目录

  • [1. 实现效果](#1. 实现效果)
  • [2. 安装 `sortablejs` 插件](#2. 安装 sortablejs 插件)
  • [3. 完整组件代码](#3. 完整组件代码)
  • [4. 注意点](#4. 注意点)

1. 实现效果

2. 安装 sortablejs 插件

sortablejs 更多用法

shell 复制代码
cnpm i --save sortablejs

3. 完整组件代码

html 复制代码
<template>
  <div class="home">
    <div class="body">
      <el-table :data="tableData" border row-key="date" class="draggable-table" style="width: 100%">
        <el-table-column prop="sortNo" label="序号">
          <template slot-scope="{ row }">
            <img
              class="handle"
              :src="require('./icon-drop.png')"
              style="width: 20px; height: 20px; object-fit: contain"
            />
          </template>
        </el-table-column>
        <el-table-column prop="date" label="日期"></el-table-column>
        <el-table-column prop="name" label="姓名"></el-table-column>
        <el-table-column prop="address" label="地址"></el-table-column>
      </el-table>
    </div>
  </div>
</template>

<script>
  import Sortable from 'sortablejs'
  export default {
    name: 'Demo',
    data() {
      return {
        tableData: [
          // 略去数据,与前段代码一直
          { date: '2024-01-02', name: '张三1', address: '深圳市' },
          { date: '2024-01-03', name: '李四2', address: '成都市' },
          { date: '2024-01-04', name: '王五3', address: '重庆市' },
          { date: '2024-01-05', name: '麻六4', address: '上海市' },
          { date: '2024-01-07', name: 'kk5', address: '上海市01' },
          { date: '2024-01-08', name: 'fantay6', address: '上海市02' },
        ],
      }
    },
    mounted() {
      const tbody = document.querySelector('.draggable-table .el-table__body-wrapper tbody')
      new Sortable(tbody, {
        handle: '.handle', // handle's class
        animation: 150,
        // 需要在odEnd方法中处理原始eltable数据,使原始数据与显示数据保持顺序一致
        onEnd: ({ newIndex, oldIndex }) => {
          const targetRow = this.tableData[oldIndex]
          this.tableData.splice(oldIndex, 1)
          this.tableData.splice(newIndex, 0, targetRow)
          console.table(this.tableData)
        },
      })
    },
  }
</script>

<style scoped lang="scss">
  .home {
    .body {
      width: 890px;
      height: 500px;
      border: #ff3366 solid 10px;
      box-sizing: border-box;
      padding: 20px;
      box-sizing: border-box;
    }
  }
  .handle {
    cursor: move;
    display: flex;
    align-content: center;
  }
</style>

4. 注意点

  1. 很多文章使用 Sortable.create 但是我这样用没生效,使用 new Sortable 就行了
  2. 页面table添加类 draggable-table
  3. handle 可以配置可拖拽的指定元素,默认是当前行触发
相关推荐
jay神16 小时前
基于团队模式的C程序设计课程辅助教学管理系统
java·spring boot·vue·web开发·管理系统
钛态17 小时前
前端TypeScript高级技巧:让你的代码更安全
前端·vue·react·web
吴声子夜歌2 天前
Vue3——路由管理
前端·vue·es6·vue-router
钛态2 天前
前端微前端架构:大项目的救命稻草还是自找麻烦?
前端·vue·react·web
钛态2 天前
前端趋势:别被时代抛弃
前端·vue·react·web
恶猫3 天前
网页自动化模拟操作时,模拟真实按键触发事件【终级方案】
前端·javascript·自动化·vue·网页模拟
无心使然云中漫步3 天前
Openlayers调用ArcGis地图服务之五 —— 要素识别(/identify)
前端·arcgis·vue·数据可视化
蜡台3 天前
H5入住浙里办App详细步骤
vue·uniapp·h5·浙政钉
呱牛do it4 天前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 7)
java·vue
呱牛do it6 天前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 5)
java·vue