您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關拖拽插件sortable.js如何實現el-table表格拖拽效果,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
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> <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>
這里有一個細節,就是表頭數據拖動的時候,可能導致渲染數據不對的問題,有的博主是搞兩個表頭數組數據的,其實也是一種解決問題的方案。不過個人愚見略有麻煩,其實一個表頭數組數據即可。只要及時清空,重新賦值即可
這里使用的是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表格拖拽效果”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。