表格行拖拽排序

拖拽排序的功能依赖于 sortablejs 库,需要先安装这个库

这边安装的是 1.12.0 版本的,可以正常使用

完整版的实例可以看当前目录下的 TableDrag.vue

1 安装 sortablejs

js 复制代码
// 普通安装
npm install sortablejs --save

// 安装指定版本(建议安装此版本)
npm install sortablejs@1.12.0 --save

2 vue示例

html 复制代码
<template>
  <div class="table-drag-demo">
    <!-- 按钮 -->
    <div class="top-btns">
      <el-button type="primary" size="medium" @click="startDrag">开启拖拽</el-button>
      <el-button type="primary" size="medium" @click="endDrag">关闭拖拽</el-button>
    </div>

    <!-- 表格 -->
    <el-table :data="tableData" border row-key="id">
      <el-table-column prop="id" align="center" label="ID" width="55"></el-table-column>
      <el-table-column prop="name" align="center" label="名称"></el-table-column>
      <el-table-column prop="age" align="center" label="主页地址"></el-table-column>
    </el-table>
  </div>
</template>

<script>
  // 表格拖拽排序组件
  import Sortable from "sortablejs";
  export default {
    name: "TableDrag",
    data() {
      return {
        tableData: [], // 表格数据
        sortable: {}, // Sortable实例
      };
    },
    created() {
      // mock数据
      let arr = [];
      for (let i = 0; i < 5; i++) {
        arr.push({
          id: i,
          name: `学生 - ${i}`,
          age: i + 10,
        });
      }
      this.tableData = arr;
    },
    mounted() {
      this.initSort(); // 组件挂载,初始化Sortable
    },
    methods: {
      // 初始化拖拽
      initSort() {
        let tbody = document.querySelector(".el-table__body-wrapper tbody");
        let _this = this;
        this.sortable = Sortable.create(tbody, {
          disabled: true, // 设置为true,默认不允许拖拽,设置为false的时候,就是默认开启拖拽
          onEnd({ newIndex, oldIndex }) {
            const currRow = _this.tableData.splice(oldIndex, 1)[0];
            _this.tableData.splice(newIndex, 0, currRow);
          },
        });
      },
      // 开始拖拽
      startDrag() {
        // let state = this.sortable.option("disabled"); // 获取是否禁止拖拽,true为禁止,false为启用
        this.sortable.option("disabled", false);
      },
      // 关闭拖拽
      endDrag() {
        this.sortable.option("disabled", true);
      },
    },
  };
</script>

<style lang="scss" scoped>
  .table-drag-demo {
    padding: 15px;
    .top-btns {
      margin-bottom: 15px;
    }
  }
</style>

3 react示例

js 复制代码
import { useEffect, useRef } from "react";
import { Table, Row, Button, Space } from "antd";
import Sortable from "sortablejs";

const columns = [
  {
    title: "Name",
    dataIndex: "name",
    key: "name",
  },
  {
    title: "Age",
    dataIndex: "age",
    key: "age",
  },
  {
    title: "Address",
    dataIndex: "address",
    key: "address",
  },
];

const data = [
  {
    key: "1",
    name: "1 John Brown",
    age: 11,
    address: "New York No. 1 Lake Park",
  },
  {
    key: "2",
    name: "2 Jim Green",
    age: 22,
    address: "London No. 1 Lake Park",
  },
  {
    key: "3",
    name: "3 Joe Black",
    age: 33,
    address: "Sidney No. 1 Lake Park",
  },
];

const TableDrag = () => {
  // Ref
  const sortableRef = useRef(null);
  const dataSourceRef = useRef(data); // 注意:dataSource必须使用ref,不能使用state,state会导致更新不同步,拖拽异常

  // 初始化
  useEffect(() => {
    initSort();
  }, []);

  // 初始化拖拽
  const initSort = () => {
    const tbody = document.querySelector(".ant-table .ant-table-tbody");
    sortableRef.current = Sortable.create(tbody, {
      disabled: false, // true为不允许拖拽,false为允许拖拽
      onEnd({ newIndex, oldIndex }) {
        const currRow = dataSourceRef.current.splice(oldIndex, 1)[0];
        dataSourceRef.current.splice(newIndex, 0, currRow);
      },
    });
  };
  // 开启拖拽
  const startDrag = () => {
    // let state = sortableRef.current?.option("disabled"); // 获取是否禁止拖拽,true为禁止,false为启用
    // 配置项手册:http://www.sortablejs.com/options.html
    sortableRef.current?.option("disabled", false);
  };
  // 关闭拖拽
  const endDrag = () => {
    sortableRef.current?.option("disabled", true);
  };
  // 打印数据
  const printData = () => {
    console.log(dataSourceRef.current);
  };

  return (
    <div>
      <Table columns={columns} dataSource={data} pagination={false} />
      <Row justify="center" style={{ marginTop: "20px" }}>
        <Space>
          <Button type="primary" onClick={startDrag}>
            开启拖拽
          </Button>
          <Button type="primary" onClick={endDrag}>
            关闭拖拽
          </Button>
          <Button type="primary" onClick={printData}>
            打印数据
          </Button>
        </Space>
      </Row>
    </div>
  );
};

export default TableDrag;
相关推荐
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
迪普阳光开朗很健康4 天前
告别繁琐!用ApkInfoQuick快速提取APK关键信息
android·rust·react