中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

拖拽插件sortable.js如何實現el-table表格拖拽效果

發布時間:2022-02-08 14:53:34 來源:億速云 閱讀:336 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關拖拽插件sortable.js如何實現el-table表格拖拽效果,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

問題描述

Sortable.js是一款優秀的js拖拽庫,因為是原生js寫的,所以性能不錯,也支持移動端哦。

案例一 簡單拖拽

效果圖

拖拽插件sortable.js如何實現el-table表格拖拽效果

代碼附上

關于理解看注釋哦,運行的話復制粘貼即可

<!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>
    <h3>優先扣款順序:</h3>
    <!-- 一般來說,拖動的結構就是:外邊一個拖動容器,里面是一個又一個的拖動項 -->
    <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表格拖拽

這里有一個細節,就是表頭數據拖動的時候,可能導致渲染數據不對的問題,有的博主是搞兩個表頭數組數據的,其實也是一種解決問題的方案。不過個人愚見略有麻煩,其實一個表頭數組數據即可。只要及時清空,重新賦值即可

效果圖

拖拽插件sortable.js如何實現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 />
    <h4>表頭數據</h4>
    <pre>{{ tableHeader }}</pre>
    <br />
    <h4>表體數據</h4>
    <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>

關于“拖拽插件sortable.js如何實現el-table表格拖拽效果”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乌鲁木齐县| 大庆市| 清新县| 崇仁县| 广德县| 莆田市| 龙岩市| 淮南市| 内丘县| 北宁市| 木里| 沂水县| 嘉兴市| 哈巴河县| 梁平县| 庐江县| 达日县| 恩平市| 乌鲁木齐县| 岗巴县| 林西县| 福贡县| 板桥市| 双城市| 潜江市| 伽师县| 昌平区| 丽水市| 上虞市| 定南县| 太湖县| 如东县| 曲沃县| 花莲市| 波密县| 蒲江县| 三穗县| 屏边| 博罗县| 厦门市| 奇台县|