使用Sortable.js 对el-table 的列进行拖动

541 阅读2分钟

需求

对表格的列可进行拖动,隐藏

解决方式

el-table 官方文档里面并没有可以让table 拖动的实例,那么我们就要用到第三方JavaScript库: Sortable.js 它允许您轻松地使网页中的元素(如列表项、表格行等)可拖动并重新排序。Sortable.js 具有简洁的 API 和良好的兼容性,能为用户提供直观和交互性强的排序体验。

使用Sortable.js

下载
npm install sortablejs --save
在界面引用
import Sortable from "sortablejs";

示例代码

<template>
  <div class="app-container">
    <el-table
      v-loading="loading"
      :height="height"
      :data="orderdatatableList"
      @select="select"
      @select-all="selectAll"
      ref="multipleTable"
      v-el-table-infinite-scroll="load"
      border
      :key="tableKey"
      :row-key="
        (row) => {
          return row.id;
        }
      "
    >
      <el-table-column type="selection" width="75" align="center" fixed />
      <el-table-column
        v-for="(item, index) in columnslist"
        v-if="item.isCheck"
        :key="index"
        :label="item.label"
        :prop="item.prop"
        align="center"
      >
    
      </el-table-column>
    
      <el-table-column
        label="操作"
        align="center"
        fixed="right"
        class-name="small-padding fixed-width"
      >
        <template slot-scope="scope">
          <el-button
            size="mini"
            type="text"
            icon="el-icon-edit"
    
            >修改</el-button
          >
          <el-button
            size="mini"
            type="text"
            icon="el-icon-delete"
       
            >删除</el-button
          >
        </template>
      </el-table-column>
    </el-table>
  
    <!-- 列显示设置对话框 -->
    <el-dialog :visible.sync="columnSettingVisible" title="列显示设置">
      <el-checkbox-group v-model="checkedColumns">
        <el-checkbox
          v-for="column in columns"
          :key="column.prop"
          :label="column.prop"
          >{{ column.label }}</el-checkbox
        >
      </el-checkbox-group>
      <div slot="footer" class="dialog-footer">
        <el-button @click="columnSettingVisible = false">取 消</el-button>
        <el-button type="primary" @click="saveColumnSettings">保 存</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script>
import {
  listFacility,
} from "@/api/system/facility";
import Sortable from "sortablejs";
export default {
  name: "Facility",
  data() {
    return {
      checkedColumns: [],
      columnSettingVisible: false,
      tableKey: 1, // 用于强制重新渲染表格的 key
      columnslist: [], //深拷贝出来的行
      columns: [
        {
          prop: "sid",
          label: "设备信息表id",
          align: "center",
          isCheck: true,
        },
        {
          prop: "facilityCode",
          label: "设备代码",
          align: "center",
          isCheck: true,
        },
        {
          prop: "facilityNo",
          label: "设备编码",
          align: "center",
          isCheck: true,
        },
        {
          prop: "facilityDesc",
          label: "设备名称",
          align: "center",
          isCheck: true,
        },
        {
          prop: "proccessNo",
          label: "工序号",
          align: "center",

          isCheck: true,
        },
        {
          prop: "facilityType",
          label: "设备分类",
          align: "center",
          isCheck: true,
        },
        {
          prop: "facilitySimpl",
          label: "设备简称",
          align: "center",

          isCheck: true,
        },
        {
          prop: "sortOrder",
          label: "设备排序",
          align: "center",
          isCheck: true,
        },
      ],
  },

  created() {
    if (localStorage.getItem("columnslist") == null) {
      this.columnslist = JSON.parse(JSON.stringify(this.columns));
    } else {
      //获取
      this.columnslist = JSON.parse(localStorage.getItem("columnslist"));
    }
    this.getList();
  },
  mounted() {
    //表格拖拽方法
    this.columnDrop();
  },

  methods: {
    /**
     * 列拖拽
     */
    columnDrop() {
      const _this = this;
      console.log("数据", this.columnslist);
      const wrapperTr = document.querySelector(".el-table__header-wrapper tr");
      this.sortable = Sortable.create(wrapperTr, {
        animation: 180,
        delay: 0,
        onEnd: (evt) => {
          const empty = 1;
          // 跳过显示的列数量,如开头我们用了一个多选框
          const oldItem = _this.columnslist[evt.oldIndex - empty];
          _this.columnslist.splice(evt.oldIndex - empty, 1);
          _this.columnslist.splice(evt.newIndex - empty, 0, oldItem);
          // 每一次拖拽后都要重绘一次
          _this.reDrawTable();
          //存储数据
          localStorage.setItem(
            "columnslist",
            JSON.stringify(_this.columnslist)
          );
          console.log("存储_this.columnslist", _this.columnslist);
        },
      });
    },
    /**
     * 触发表格重绘
     */
    reDrawTable() {
      this.tableKey = Math.random();
      this.$nextTick(() => {
        this.columnDrop();
      });
    },

    // 打开列设置界面并初始化选中状态
    openColumnSetting() {
      this.columnSettingVisible = true;
      //获取
      if (localStorage.getItem("columns") == null) {
      } else {
        this.columns = JSON.parse(localStorage.getItem("columns"));
      }

      this.checkedColumns = this.columns
        .filter((column) => column.isCheck)
        .map((column) => column.prop);
      // 初始化checkedColumns,根据columns中的visible属性设置
    },
    saveColumnSettings() {
      console.log(this.checkedColumns);
      this.columns.forEach((column) => {
        const visibleIndex = this.checkedColumns.indexOf(column.prop);
        column.isCheck = visibleIndex !== -1;
      });
      const filteredObjects = this.columns.filter((obj) =>
        this.checkedColumns.includes(obj.prop)
      );
      this.columnslist = filteredObjects;
      //存储数据
      localStorage.setItem("columns", JSON.stringify(this.columns));
      console.log("储存this.columns", this.columns);
      //存储数据
      localStorage.setItem("columnslist", JSON.stringify(this.columnslist));
      console.log("存储_this.columnslist", this.columnslist);

      // 关闭对话框
      this.columnSettingVisible = false;
      this.reDrawTable();
    },

    /** 查询检修信息表列表 */
    getList() {
      listFacility(this.queryParams).then((response) => {
        this.orderdatatableList = this.orderdatatableList;
        this.total = response.total;
  
      });
    },
   

  },
};
</script>


博客

同时发表在饼干

Snipaste_2024-08-19_15-53-31.png