Element實(shí)現(xiàn)表格分頁(yè)數(shù)據(jù)選擇+全選所有完善批量操作
后臺(tái)管理系統(tǒng)中的列表頁(yè)面,一般都會(huì)有對(duì)列表數(shù)據(jù)進(jìn)行批量操作的功能,例如:批量刪除、批量刪除等。
之前項(xiàng)目中只是簡(jiǎn)單的用到Element框架中常規(guī)的屬性、事件。在一次機(jī)緣巧合下,了解到一個(gè)公司內(nèi)部的框架是基于Element框架內(nèi)部實(shí)現(xiàn)了一些插件功能,對(duì)于表格這一塊完善了很多功能,當(dāng)時(shí)沒(méi)有把握住機(jī)會(huì)去看源碼是怎么實(shí)現(xiàn)的,現(xiàn)在有點(diǎn)小后悔呢,嚶嚶嚶~~~~沒(méi)關(guān)系,自己慢慢一點(diǎn)一點(diǎn)實(shí)現(xiàn)。
實(shí)現(xiàn)的功能有:
- 分頁(yè)數(shù)據(jù)選擇
- 全選所有數(shù)據(jù)(不是element框架自帶的全選本頁(yè)哦?。?/li>
1、分頁(yè)數(shù)據(jù)選擇
一開(kāi)始以為不就是分頁(yè)的時(shí)候把之前選中的數(shù)據(jù)存儲(chǔ)在一個(gè)list里面嘛,然后選擇的時(shí)候map一下。等到自己寫代碼的時(shí)候,會(huì)發(fā)現(xiàn)沒(méi)有那么簡(jiǎn)單,百度后,發(fā)現(xiàn)有兩個(gè)屬性被忽視了
- row-key
- reserve-selection


代碼截圖:

事件代碼:
getRowKeys (row) {
return row.execId
}
這樣通過(guò) selectionChange 方法就能獲取頁(yè)面中選中數(shù)據(jù)的改變,將選中的數(shù)據(jù)保存到list中
selectionChange (rows) {
this.checkList = rows
}
2、全選所有數(shù)據(jù)
element框架中有select-all事件,全選本頁(yè)所有數(shù)據(jù),但是項(xiàng)目中,經(jīng)常會(huì)遇到說(shuō)對(duì)所有的進(jìn)行操作,例如批量刪除(刪除所有數(shù)據(jù),這個(gè)權(quán)限有點(diǎn)大)
實(shí)現(xiàn)思路:
- 一個(gè)全選所有復(fù)選框,當(dāng)選中時(shí),前端傳遞一個(gè)參數(shù)Flag:1給后臺(tái),后臺(tái)就會(huì)知道這是對(duì)所有數(shù)據(jù)進(jìn)行操作,同時(shí)前后臺(tái)之間都不用進(jìn)行龐大的數(shù)據(jù)傳輸
<el-checkbox v-model="allCheck" @change="allCheckEvent">全選所有</el-checkbox>
- 選中全選所有復(fù)選框,當(dāng)前頁(yè)數(shù)據(jù)需全部是選中狀態(tài),翻頁(yè)到另一頁(yè),這一頁(yè)的數(shù)據(jù)也是全部選中狀態(tài) (監(jiān)聽(tīng)當(dāng)前頁(yè)中數(shù)據(jù))
allCheckEvent () {
if (this.allCheck) {
this.testList.forEach(row => {
this.$refs.recordTable.toggleRowSelection(row, true)
})
} else {
this.$refs.recordTable.clearSelection()
}
}
watch: {
testList: {
handler (value) {
if (this.allCheck) {
let that = this
let len = that.checkList.length
value.forEach(row => {
for (let i = 0; i < len; i++) {
if (row.execId === that.checkList[i].execId) {
that.$refs.recordTable.toggleRowSelection(row, false)
break
} else {
that.$refs.recordTable.toggleRowSelection(row, true)
}
}
})
}
},
deep: true
}
}
- 選中全選所有復(fù)選框,同時(shí),已經(jīng)翻頁(yè)了兩頁(yè),選中的數(shù)據(jù)是兩頁(yè)數(shù)據(jù),若取消其中一行數(shù)據(jù)的選中狀態(tài),此時(shí),全選所有取消,當(dāng)前選中的數(shù)據(jù)應(yīng)是:已翻頁(yè)的兩頁(yè)數(shù)據(jù)-取消的那一行數(shù)據(jù)
selectOne () {
if (this.allCheck) {
this.allCheck = false
}
}
實(shí)現(xiàn)的表格:

走了不少?gòu)澛凡抛⒁獾降膯?wèn)題:
- 若從第一頁(yè)翻選到第二頁(yè),然后又回到第一頁(yè),選中的數(shù)據(jù)理應(yīng)是1+2兩頁(yè)的數(shù)據(jù),現(xiàn)實(shí)是1+2+1這三頁(yè)數(shù)據(jù),在展現(xiàn)形式上是看不出來(lái)問(wèn)題,而且前面說(shuō)了,全選所有的時(shí)候,我向后臺(tái)傳的參數(shù)只是一個(gè)flag,而不是這些選中數(shù)據(jù)。但是若在第一頁(yè)取消一行數(shù)據(jù),此時(shí)全選所有數(shù)據(jù)框已取消,本條數(shù)據(jù)也不是選中狀態(tài),翻到第二頁(yè),在回到第二頁(yè),Duang~那條數(shù)據(jù)又回到了選中狀態(tài)!因?yàn)檫x中數(shù)據(jù)中該條數(shù)據(jù)是兩條啊,你取消了一個(gè),另一個(gè)還在呀,當(dāng)然你再取消一次,再回來(lái),是取消狀態(tài),bug,bug,bug!
- 想到的就是數(shù)據(jù)要去重,首先想到的是從結(jié)果去重,在selectionChange方法中去重,悲劇了,根本不起作用,理清思路后發(fā)現(xiàn):當(dāng)選擇項(xiàng)發(fā)生改變時(shí),調(diào)用selectionChange方法獲取選中的所有數(shù)據(jù),此時(shí)我們用forEach遍歷數(shù)據(jù),用toggleRowSelection方法將頁(yè)面中的數(shù)據(jù)選中,此時(shí)toggleRowSelection一次,selectionChange方法執(zhí)行一次 那就在監(jiān)聽(tīng)數(shù)據(jù)時(shí),如果數(shù)據(jù)ID相同,不在執(zhí)行toggleRowSelection方法
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
vue-router vuex-oidc動(dòng)態(tài)路由實(shí)例及功能詳解
這篇文章主要為大家介紹了vue-router vuex-oidc動(dòng)態(tài)路由實(shí)例及功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
vue3中配置文件vue.config.js不生效的解決辦法
這篇文章主要介紹了vue3中配置文件vue.config.js不生效的解決辦法,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家解決問(wèn)題有一定的幫助,需要的朋友可以參考下2024-05-05
Vue.js中class與style的增強(qiáng)綁定實(shí)現(xiàn)方法
由于Class和Style綁定使用頻繁,字符串拼接麻煩且易錯(cuò),因此,Vue.js 做了專門的增強(qiáng),表達(dá)式結(jié)果的類型除了字符串之外,還可以是對(duì)象或數(shù)組,本文給大家講解Vue.js中class與style的增強(qiáng)綁定知識(shí),感興趣的朋友一起看看吧2023-04-04
vue props 單項(xiàng)數(shù)據(jù)流實(shí)例分享
在本篇文章里小編給大家分享的是一篇關(guān)于vue props 單項(xiàng)數(shù)據(jù)流實(shí)例分享內(nèi)容,需要的朋友們可以參考下。2020-02-02
vuex直接修改state、commit和dispatch修改state的用法及區(qū)別說(shuō)明
這篇文章主要介紹了vuex直接修改state、commit和dispatch修改state的用法及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Vue3響應(yīng)式高階用法之shallowRef()的使用
在Vue3框架中,shallowRef()為開(kāi)發(fā)者提供了細(xì)粒度的響應(yīng)式控制能力,特別適用于處理深層嵌套對(duì)象或需要部分響應(yīng)式的場(chǎng)景,本文就來(lái)詳細(xì)的介紹一下,感興趣的可以了解一下2024-09-09
vue-router beforeEach跳轉(zhuǎn)路由驗(yàn)證用戶登錄狀態(tài)
這篇文章主要介紹了vue-router beforeEach跳轉(zhuǎn)路由驗(yàn)證用戶登錄狀態(tài),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12

