淺談element關(guān)于table拖拽排序問(wèn)題
最近在使用element table的時(shí)候,經(jīng)常會(huì)遇到排序的問(wèn)題,如果只是簡(jiǎn)單的排序的話,element官方已經(jīng)給出了指定的方法
//table的默認(rèn)排序方式是按ID排序 順序?yàn)檫f減 這里可以改成其它 比如 order
<el-table :data="tableData" :default-sort="{prop: 'ID', order: 'descending'}">
//設(shè)置sortable屬性時(shí)出現(xiàn)排序按鈕
<el-table-column prop="ID" label="座號(hào)" sortable>
</el-table>
但是,element官方組件并不支持拖拽排序,我在這里引入sortablejs實(shí)現(xiàn)拖拽排序的功能
sortablejs GitHub地址
//安裝sortable.js
Install with NPM:
$ npm install sortablejs --save
//在組件內(nèi)引入
import Sortable from 'sortablejs'
//為需要拖拽排序的表格添加ref屬性
<el-table ref="dragTable">
//在數(shù)據(jù)渲染完畢添加拖拽事件
created(){
this.getBanner()
},
methods:{
async getBanner(val){
await apiGetBanner().then((res)=>{
this.bannerTable = res.data.data;
})
this.oldList = this.bannerTable.map(v => v.id);
this.newList = this.oldList.slice();
this.$nextTick(() => {
this.setSort() //數(shù)據(jù)渲染完畢執(zhí)行方法
})
}
setSort() {
const el = this.$refs.dragTable.$el.querySelectorAll(
'.el-table__body-wrapper > table > tbody'
)[0];
this.sortable = Sortable.create(el, {
// Class name for the drop placeholder,
ghostClass: 'sortable-ghost',
setData: function(dataTransfer) {
dataTransfer.setData('Text', '')
},
//拖拽結(jié)束執(zhí)行,evt執(zhí)向拖拽的參數(shù)
onEnd: evt => {
//判斷是否重新排序
if(evt.oldIndex !== evt.newIndex){
let data = {
id:this.bannerTable[evt.oldIndex].id,
banner_order:evt.newIndex
}
//數(shù)據(jù)提交失敗則恢復(fù)舊的排序
apiPutBanner(data).catch(()=>{
const targetRow = this.bannerTable.splice(evt.oldIndex, 1)[0];
this.bannerTable.splice(evt.newIndex, 0, targetRow);
})
}
}
})
}
}
如果需要列拖拽的話,可以參考下面的代碼,和上面是一樣的原理,在這里我就不贅述了
//行拖拽
rowDrop() {
const tbody = document.querySelector('.el-table__body-wrapper tbody')
const _this = this
Sortable.create(tbody, {
onEnd({ newIndex, oldIndex }) {
const currRow = _this.tableData.splice(oldIndex, 1)[0]
_this.tableData.splice(newIndex, 0, currRow)
}
})
},
//列拖拽
columnDrop() {
const wrapperTr = document.querySelector('.el-table__header-wrapper tr')
this.sortable = Sortable.create(wrapperTr, {
animation: 180,
delay: 0,
onEnd: evt => {
const oldItem = this.dropCol[evt.oldIndex]
this.dropCol.splice(evt.oldIndex, 1)
this.dropCol.splice(evt.newIndex, 0, oldItem)
}
})
}
到此這篇關(guān)于淺談element關(guān)于table拖拽排序問(wèn)題的文章就介紹到這了,更多相關(guān)element table拖拽排序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
測(cè)試平臺(tái)開發(fā)vue組件化重構(gòu)前端代碼
這篇文章主要為大家介紹了測(cè)試平臺(tái)開發(fā)vue組件化重構(gòu)前端代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
vue實(shí)現(xiàn)一個(gè)單獨(dú)的組件注釋
這篇文章主要介紹了vue實(shí)現(xiàn)一個(gè)單獨(dú)的組件注釋,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
vue項(xiàng)目中使用tinymce編輯器的步驟詳解
本文分步驟給大家介紹了vue項(xiàng)目中使用tinymce編輯器的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
npm?ERR!?code?E404在vscode安裝插件時(shí)報(bào)錯(cuò)的兩種解決方案
這篇文章主要給大家介紹了關(guān)于npm?ERR!?code?E404在vscode安裝插件時(shí)報(bào)錯(cuò)的兩種解決方案,關(guān)于這個(gè)問(wèn)題,通常是由于插件名稱輸入錯(cuò)誤、網(wǎng)絡(luò)問(wèn)題或插件已被刪除引起的,文中將兩種解決方法都介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
Vue 實(shí)現(xiàn)樹形視圖數(shù)據(jù)功能
這篇文章主要介紹了Vue 實(shí)現(xiàn)樹形視圖數(shù)據(jù)功能,利用簡(jiǎn)單的樹形視圖實(shí)現(xiàn)的,在實(shí)現(xiàn)過(guò)程中熟悉了組件的遞歸使用,感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05
Vue?+?Axios?請(qǐng)求接口方法與傳參方式詳解
使用Vue的腳手架搭建的前端項(xiàng)目,通常都使用Axios封裝的接口請(qǐng)求,項(xiàng)目中引入的方式不做多介紹,本文主要介紹接口調(diào)用與不同形式的傳參方法。對(duì)Vue?+?Axios?請(qǐng)求接口方法與傳參問(wèn)題感興趣的朋友一起看看吧2021-12-12
vue中的this.$refs,this.$emit,this.$store,this.$nextTick的使用方式
這篇文章主要介紹了vue中的this.$refs,this.$emit,this.$store,this.$nextTick的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04

