关于拖拽:拖拽插件sortablejs之eltable表格拖拽效果代码

44次阅读

共计 4212 个字符,预计需要花费 11 分钟才能阅读完成。

问题形容

Sortable.js 是一款优良的 js 拖拽库,因为是原生 js 写的,所以性能不错,也反对挪动端哦。本文举两个案例来学习一下。

案例一 简略拖拽

效果图

代码附上

对于了解看正文哦,运行的话复制粘贴即可

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8" />
    <title>sortable.js 拖动例子 </title>
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, minimal-ui">
    <!-- 引入插件 -->
    <script src="https://www.itxst.com/package/sortable/sortable.min.js"></script>
    <style>
        #wrapBox {
            width: 360px;
            /* 拖动容器的高度,由拖动项的高度撑开 */
            height: auto;
        }

        #wrapBox div {
            padding: 8px;
            background-color: #fdfdfd;
            border: solid 1px #eee;
            margin-bottom: 10px;
            /* 增加鼠标悬浮款式为挪动的款式,要不然不难看 */
            cursor: move;
            font-size: 13px;
        }

        /* 设置鼠标按下时候的款式,加了难看些 */
        #wrapBox div:active {background-color: #eee;}
    </style>
</head>

<body>
    <h2> 优先扣款程序:</h2>
    <!-- 一般来说,拖动的构造就是:外边一个拖动容器,外面是一个又一个的拖动项 -->
    <div id="wrapBox">
        <div data-id="1 工商银行"> 工商银行 </div>
        <div data-id="2 建设银行"> 建设银行 </div>
        <div data-id="3 中国银行"> 中国银行 </div>
        <div data-id="4 农业银行"> 农业银行 </div>
        <div data-id="5 交通银行"> 交通银行 </div>
    </div>
    <script>
        // 第一步,获取拖动容器
        var wrap = document.getElementById('wrapBox');
        // 第二步,设置拖动项的拖动规定
        var rules = {
            animation: 500, // 拖动时的元素的地位变动的动画时长,// 拖动完结后的回调函数
            onEnd: function (event) {console.log('参数是拖动事件对象', event);
                // 获取拖动后容器中的每一项的地位排序
                var arr = sortable.toArray();
                console.log('地位排序', arr);
            },
        };
        // 第三步,初始化 --> 给拖动容器增加拖动规定 
        var sortable = Sortable.create(wrap, rules);
        /**
         * 插件自带的办法:*      1. sortable.toArray() 获取序列化后的每个 item 元素的 id 属性的数组
         *      2. Sortable.create(wrap, rules) 给拖动容器增加拖动规定
         * */
    </script>
</body>

</html>

案例二 el-table 表格拖拽

这里有一个细节,就是表头数据拖动的时候,可能导致渲染数据不对的问题,有的博主是搞两个表头数组数据的,其实也是一种解决问题的计划。不过集体愚见略有麻烦,其实一个表头数组数据即可。只有及时清空,从新赋值即可

效果图

代码附上

这里应用的是 vue,所以要下载哦 cnpm install sortablejs --save

代码间接复制粘贴即可运行看效果图了,对于应用请看正文哦

<template>
  <div class="myWrap">
    <el-table
      :data="tableBody"
      border
      row-key="id"
      :header-cell-style="{
        height: '48px',
        background: '#FAFAFA',
        color: '#333333',
        fontWeight: 'bold',
        fontSize: '14px',
      }"
    >
      <!-- 勾选框列 -->
      <el-table-column type="selection" width="48" fixed></el-table-column>
      <!-- 序号列 -->
      <el-table-column label="序号" type="index" width="50" fixed>
      </el-table-column>
      <!-- 表头列 -->
      <el-table-column
        v-for="(item, index) in tableHeader"
        :key="item.index"
        :prop="item.prop"
        :label="item.label"
      >
      </el-table-column>
    </el-table>
    <br />
    <h3> 表头数据 </h3>
    <pre>{{tableHeader}}</pre>
    <br />
    <h3> 表体数据 </h3>
    <pre>{{tableBody}}</pre>
  </div>
</template>
<script>
// 引入 sortablejs 插件,拖拽次要靠的是这个插件
import Sortable from "sortablejs";
export default {data() {
    return {
      // 表头数据
      tableHeader: [
        {
          label: "姓名",
          prop: "name",
        },
        {
          label: "年龄",
          prop: "age",
        },
        {
          label: "他乡",
          prop: "home",
        },
        {
          label: "喜好",
          prop: "hobby",
        },
      ],
      // 表体数据
      tableBody: [
        {
          id: "1",
          name: "孙悟空",
          age: 500,
          home: "花果山",
          hobby: "吃桃子",
        },
        {
          id: "2",
          name: "猪八戒",
          age: 88,
          home: "高老庄",
          hobby: "吃包子",
        },
        {
          id: "3",
          name: "沙和尚",
          age: 1000,
          home: "通天河",
          hobby: "游泳",
        },
        {
          id: "4",
          name: "唐僧",
          age: 99999,
          home: "东土大唐",
          hobby: "念经",
        },
      ],
    };
  },
  mounted() {
    // 列的拖拽初始化
    this.columnDropInit();
    // 行的拖拽初始化
    this.rowDropInit();},
  methods: {
    // 列拖拽
    columnDropInit() {
      // 第一步,获取列容器
      const wrapperColumn = document.querySelector(".el-table__header-wrapper tr");
      // 第二步,给列容器指定对应拖拽规定
      this.sortable = Sortable.create(wrapperColumn, {
        animation: 500,
        delay: 0,
        onEnd: (event) => {
          console.log(
            "拖拽实现当前发现表头数据并没有扭转,所以须要咱们手动更新表头数据",
            this.tableHeader
          );
          console.log(
            "依据旧索引和新索引去更新,其实就是替换地位",
            event.oldIndex,
            event.newIndex
          );

          // 接下来做索引的替换
          let tempHableHeader = [...this.tableHeader]; // 先存一份长期变量表头数据
          let temp; // 长期变量用于替换
          temp = tempHableHeader[event.oldIndex - 2]; // 留神这里 - 2 是因为,我在表格的后面加了两列(勾选框列,和序号列)tempHableHeader[event.oldIndex - 2] =
            tempHableHeader[event.newIndex - 2]; // 如果没有这两列,序号就是失常对应的,就不必减 2
          tempHableHeader[event.newIndex - 2] = temp;

          // 重要的事件说三遍!!!// 这里肯定要先把表头数据清空,而后再下一轮中去赋值,否则会渲染谬误
          // 这里肯定要先把表头数据清空,而后再下一轮中去赋值,否则会渲染谬误
          // 这里肯定要先把表头数据清空,而后再下一轮中去赋值,否则会渲染谬误
          this.tableHeader = []; // 大家能够注掉试试哦
          this.$nextTick(() => {this.tableHeader = tempHableHeader;});
        },
      });
    },
    // 行拖拽
    // 集体认为行拖拽不必加,因为加了当前,就不能双击选行单元格的文字了,当然还是要听产品大佬安顿
    rowDropInit() {
      // 第一步,获取行容器
      const wrapperRow = document.querySelector(".el-table__body-wrapper tbody");
      const that = this; // 存一份指向
      // 第二步,给行容器指定对应拖拽规定
      Sortable.create(wrapperRow, {onEnd({ newIndex, oldIndex}) {
          // 这里是辨别下面的列拖拽的另外一种写法

          // 首先删除原来的那一项,并且保留一份原来的那一项,因为 splice 返回的是一个数组,数组中的第一项就是删掉的那一项
          const currRow = that.tableBody.splice(oldIndex, 1)[0];
          // 而后把这一项退出到新地位上
          that.tableBody.splice(newIndex, 0, currRow);
        },
      });
    },
  },
};
</script>
<style lang='less' scoped>
.myWrap {
  width: 100%;
  height: 100%;
  box-sizing: border-box;
  padding: 25px;
  /deep/ .el-table {
    .el-table__header-wrapper {
      tr {
        th {
          // 设置拖动款式,难看一些
          cursor: move;
        }
      }
    }
  }
}
</style>

好忘性不如烂笔头,记录一下吧 ^_^

最初附上官网:http://www.sortablejs.com/

或 https://www.itxst.com/sortabl…

正文完
 0