Vue多選框保留勾選數(shù)據(jù)實(shí)現(xiàn)方式
背景
封裝組件的時(shí)候遇到一個(gè)場(chǎng)景:
查詢(xún)兩個(gè)接口數(shù)據(jù)得到兩個(gè)分組集合, 需要?jiǎng)討B(tài)切換分組選中狀態(tài),
刷新最新的并集,并且可以保留勾選狀態(tài)+模糊搜索, 兩個(gè)分組會(huì)存在相同元素的可能.
- 第一階段:初始化頁(yè)面的時(shí)候請(qǐng)求接口并保存初始分組數(shù)據(jù), 一開(kāi)始是定義了兩個(gè)集合用來(lái)保存:data的數(shù)據(jù), 集合數(shù)據(jù)動(dòng)態(tài)切換變化的時(shí)候直接獲取最新的, 但是缺點(diǎn)是不能保存勾選狀態(tài).
- 第二階段:發(fā)現(xiàn)只能操作原:data的數(shù)據(jù), 所謂的checked再往回賦值根本沒(méi)用. 缺點(diǎn)是數(shù)據(jù)操作和列表數(shù)據(jù)模糊查詢(xún)不能實(shí)現(xiàn).
- 第三階段:發(fā)現(xiàn)了reserve-selection這個(gè)東東, 近乎完美解決問(wèn)題
總結(jié):遇到問(wèn)題先別急著造輪子, 大概率有對(duì)應(yīng)的功能標(biāo)簽了, 一般的業(yè)務(wù)根本觸及不到vue的設(shè)計(jì)缺陷的...?
問(wèn)題分析與解決
第一階段:初始化與數(shù)據(jù)同步
在頁(yè)面初始化時(shí),通過(guò)請(qǐng)求接口保存兩個(gè)分組的初始數(shù)據(jù)。
定義兩個(gè)集合來(lái)保存數(shù)據(jù),并在集合數(shù)據(jù)變化時(shí)直接獲取最新的數(shù)據(jù)。
這個(gè)方法的缺點(diǎn)是無(wú)法保存用戶(hù)的勾選狀態(tài)。
第二階段:直接操作原始數(shù)據(jù)
后來(lái)發(fā)現(xiàn),必須直接操作原始的 data 數(shù)據(jù)集合。
嘗試將勾選狀態(tài)作為屬性賦值回?cái)?shù)據(jù)集合是無(wú)效的,同時(shí)也無(wú)法實(shí)現(xiàn)數(shù)據(jù)操作和列表模糊查詢(xún)的需求。
第三階段:引入reserve-selection
最終,使用 reserve-selection 屬性解決了勾選狀態(tài)保留的問(wèn)題,這表明在遇到問(wèn)題時(shí)應(yīng)該首先考慮框架或庫(kù)本身是否提供了解決方案,而不是急于自己編寫(xiě)解決方案。
保存數(shù)據(jù)勾選狀態(tài)reserve-selection
demo簡(jiǎn)化演示
<el-table ref="table" :row-key="rowKey" :data="tableData" @selection-change="selectionChange"
max-height="666px">
<el-table-column type="selection" label="全部" width="55" align="center" :reserve-selection="true" />
<el-table-column label="姓名" align="left" prop="name" />
<el-table-column label="手機(jī)號(hào)" align="left" prop="phone"/>
</el-table> methods: {
rowKey(row) {
//row-key就是要指定一個(gè)key標(biāo)識(shí)這一行的數(shù)據(jù),保證唯一即可
return row.id;
},
// 列表選擇,val選中的表格行數(shù)據(jù)
selectionChange(val) {
console.log(val)
},
//清除表格所有的選中項(xiàng)
clearSelect(){
//方法1
this.$refs["table"].clearSelection();
//方法2
this.$refs.buyerTable.clearSelection();
},
},reserve-selection完整使用小例
在Vue.js中,`reserve-selection` 是一個(gè)用于 `<el-table>` 組件(基于 Element UI)的屬性,用于在表格分頁(yè)時(shí)保留已選中的行。
當(dāng) `reserve-selection` 屬性設(shè)置為 `true` 時(shí),表格在分頁(yè)時(shí)會(huì)保留已選中的行,而不會(huì)清除選中狀態(tài)。這樣,在用戶(hù)切換分頁(yè)時(shí),之前選中的行將保持選中狀態(tài)。
下面是一個(gè)示例,演示了如何在 `<el-table>` 組件中使用 `reserve-selection` 屬性:
<template>
<el-table
:data="tableData"
:reserve-selection="true"
@selection-change="handleSelectionChange"
>
<el-table-column type="selection"></el-table-column>
<el-table-column prop="name" label="Name"></el-table-column>
<el-table-column prop="age" label="Age"></el-table-column>
</el-table>
</template>
<script>
export default {
data() {
return {
tableData: [
{ name: 'John', age: 25 },
{ name: 'Jane', age: 30 },
{ name: 'Bob', age: 35 },
],
selectedRows: [],
};
},
methods: {
handleSelectionChange(selection) {
this.selectedRows = selection;
},
},
};
</script>在上面的示例中,`reserve-selection` 屬性設(shè)置為 `true`,并且通過(guò) `@selection-change` 事件監(jiān)聽(tīng)器,將選中的行存儲(chǔ)在 `selectedRows` 數(shù)組中。
當(dāng)用戶(hù)在表格中選擇行時(shí),`handleSelectionChange` 方法會(huì)被調(diào)用,將選中的行存儲(chǔ)在 `selectedRows` 數(shù)組中。即使用戶(hù)切換分頁(yè),已選中的行也會(huì)保持選中狀態(tài)。
請(qǐng)注意:
- reserve-selection屬性?xún)H適用于基于 Element UI 的<el-table>組件。
- 如果您使用的是其他表格組件或自定義的表格組件,可能沒(méi)有類(lèi)似的屬性或功能。
- 在這種情況下,您可能需要自行實(shí)現(xiàn)保留選中狀態(tài)的邏輯。
清除某些選中項(xiàng)
基于上述理解, 還要實(shí)現(xiàn)選中項(xiàng)清空的功能
demo代碼
for (let i = 0; i < this.selections.length; i++) {
if (true) {
this.$refs.table.toggleRowSelection(this.selections[i]);
i--;
}
}
相關(guān)知識(shí)點(diǎn)
this.$refs.table.toggleRowSelection 是在Vue.js中使用$refs訪問(wèn)組件實(shí)例的特殊語(yǔ)法。它用于在Vue組件中的方法中調(diào)用子組件的方法或訪問(wèn)子組件的屬性。
假設(shè)您有一個(gè)名為 table 的子組件,并且在父組件中使用了 ref="table" 來(lái)引用該子組件。那么,通過(guò) this.$refs.table,您可以訪問(wèn)到子組件的實(shí)例,從而調(diào)用子組件的方法或訪問(wèn)子組件的屬性。
toggleRowSelection 是一個(gè)假設(shè) table 子組件中有一個(gè)名為 toggleRowSelection 的方法的示例。它的作用是切換表格中某一行的選中狀態(tài)。
例如,假設(shè)您的 table 子組件具有以下方法:
methods: {
toggleRowSelection(row) {
// 在這里實(shí)現(xiàn)切換行選中狀態(tài)的邏輯
}
}
然后,在父組件中的某個(gè)方法中,您可以使用 this.$refs.table.toggleRowSelection(row) 來(lái)調(diào)用子組件的 toggleRowSelection 方法,并傳遞相應(yīng)的行數(shù)據(jù)作為參數(shù)。
這樣,您可以在父組件中控制子組件的行選中狀態(tài)。
請(qǐng)注意:
- 使用
$refs訪問(wèn)子組件的實(shí)例是一種直接操作子組件的方法,但也可能導(dǎo)致父子組件之間的耦合增加。 - 在設(shè)計(jì)和開(kāi)發(fā)過(guò)程中,請(qǐng)謹(jǐn)慎使用
$refs,并確保遵循Vue.js的組件通信原則。
細(xì)節(jié)優(yōu)化
- 清除某行數(shù)據(jù)時(shí), 集合的長(zhǎng)度會(huì)實(shí)時(shí)變化, 如果按照原有索引去刪除就會(huì)少刪.
- 所以, 正序刪的時(shí)候, 每刪除一個(gè)就要索引-1
- 反序刪直接刪就行
擴(kuò)展方向思考
- 狀態(tài)同步:如果兩個(gè)分組存在相同的元素,考慮使用一個(gè)映射表(例如使用 JavaScript 對(duì)象)來(lái)同步這些元素的勾選狀態(tài)。
- 模糊搜索:可以在組件內(nèi)部實(shí)現(xiàn)一個(gè)搜索方法,該方法能夠在用戶(hù)輸入搜索關(guān)鍵字時(shí)過(guò)濾數(shù)據(jù)并更新表格。
- 性能考慮:如果數(shù)據(jù)集非常大,考慮使用虛擬滾動(dòng)或分頁(yè)來(lái)提高性能。
- 用戶(hù)體驗(yàn):提供清晰的用戶(hù)反饋,例如在切換分組或執(zhí)行搜索時(shí)顯示加載指示器。
通過(guò)以上的優(yōu)化,可以確保組件在處理復(fù)雜數(shù)據(jù)和用戶(hù)交互時(shí)保持高性能和良好的用戶(hù)體驗(yàn)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vite+vue3不清除瀏覽器緩存直接下載最新代碼的解決方案
vite+vue3項(xiàng)目發(fā)布后,瀏覽器上還是舊代碼,沒(méi)有及時(shí)更新到最新代碼,下面通過(guò)本文給大家分享vite+vue3不清除瀏覽器緩存直接下載最新代碼的解決方案,感興趣的朋友一起看看吧2024-06-06
antd vue table跨行合并單元格,并且自定義內(nèi)容實(shí)例
這篇文章主要介紹了antd vue table跨行合并單元格,并且自定義內(nèi)容實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
vue2中如何更改el-dialog出場(chǎng)動(dòng)畫(huà)(el-dialog彈窗組件)
el-dialog是一個(gè)十分好用的彈窗組件,但是出場(chǎng)動(dòng)畫(huà)比較單調(diào),于是決定自定義一個(gè)出場(chǎng)動(dòng)畫(huà),本文通過(guò)實(shí)例代碼圖文相結(jié)合給大家敘述下實(shí)現(xiàn)思路,感興趣的朋友一起看看吧2022-06-06
Vue 項(xiàng)目部署在子目錄下時(shí)hash vs history 的真實(shí)區(qū)別解析
Vue子目錄部署中,hash模式穩(wěn)定且無(wú)需后端配合,而history模式需要后端支持否則容易出問(wèn)題,子目錄部署下,hash模式天生安全且頁(yè)面刷新不會(huì)404,而history模式需要正確配置Nginx才能正常工作,本文給大家介紹Vue部署在子目錄下時(shí)hash vs history區(qū)別,感興趣的朋友一起看看吧2026-01-01

