react antd checkbox實現(xiàn)全選、多選功能
背景
目前好像只有table組件有實現(xiàn)表格數(shù)據(jù)的全選功能,如果說對于list,card,collapse等其他組件來說,需要自己結(jié)合checkbox來手動實現(xiàn)全選功能。
Checkbox.Group有實現(xiàn)全選功能,但是對于需要遍歷出來的數(shù)據(jù)(接口動態(tài)返回),這種方式不太可行。

方案
考慮都使用checkbox組件來實現(xiàn),同時增加狀態(tài)管理。
1、增加一個【全選】checkbox,同時遍歷每一行數(shù)據(jù)的時候,為Panel組件的header屬性添加checkbox選擇框。
<Checkbox
indeterminate={indeterminate}
checked={checkAll}
onChange={handleClickAllCheckbox}
>
全選
</Checkbox>
const renderPanelItem = () => {
return caseList?.map((item: CaseItem) => {
const key = item.replay_id;
const isChecked = selectedRowKeys?.includes(item.task_record_id); // 判斷是否勾選
return (
<Panel
header={
<>
<Checkbox
style={{ marginRight: 5 }}
onChange={(e) => {
e.stopPropagation();
handleClickItemCheckbox(isChecked, item.task_record_id);
}}
checked={isChecked} // 視圖
/>
<CloseCircleTwoTone twoToneColor="#f5222d" style={{ marginRight: 5 }} />
<span>{item.task_case_name}</span>
</>
}
key={key}
extra={renderPanelExtra(item)}
>
// ...
</Panel>
);
});
};2、增加需要的狀態(tài)
const [selectedRowKeys, setSelectedRowKeys] = useState<number[]>([]); // 勾選的每一行數(shù)據(jù)的id集合 const [indeterminate, setIndeterminate] = useState(false); // 【全選】checkbox const [checkAll, setCheckAll] = useState(false); // 【全選】checkbox
3、當點擊【全選】checkbox的時候
- 全部勾選:把當前頁的item.id和已有的selectedRowKeys一起存起來,注意id去重
- 取消全部勾選:
setSelectedRowKeys([]) - 同時改變checkAll的狀態(tài)
const handleClickAllCheckbox = () => {
if (!checkAll) {
setSelectedRowKeys(
Array.from(new Set([...selectedRowKeys, ...(caseList?.map((item: CaseItem) => item.task_record_id) || [])])),
);
} else {
setSelectedRowKeys([]);
}
setCheckAll(!checkAll);
setIndeterminate(false); // 全選/全不選的indeterminate為false,部分選上才為true
};4、當點擊【每一行數(shù)據(jù)的checkbox】的時候
- 首選需要判斷該行數(shù)據(jù)是否已經(jīng)被勾選上:
const isChecked = selectedRowKeys?.includes(item.task_record_id); - 如果已經(jīng)被勾選上了,說明需要取消勾選,則從selectedRowKeys去除掉該id;否則,為selectedRowKeys添加上該id。
- 考慮分頁的時候,selectedRowKeys需要存放 上一頁已勾選的id 和 當前頁已勾選的id
- 然后再用 當前頁已勾選的id列表 去判斷 checkAll 和 indeterminate【全選checkbox】的狀態(tài)值
// 獲取當前頁已勾選的keys
const getCurrentCheckedList = (allKeys: number[], allData: CaseItem[]) => {
const current: number[] = [];
allKeys?.forEach((checkedId) => {
allData?.forEach((c: CaseItem) => {
if (c.task_record_id === checkedId) {
current.push(checkedId);
}
});
});
return current;
};
// 點擊每一項數(shù)據(jù)前面checkbox時
const handleClickItemCheckbox = (isChecked: boolean, taskRecordId: number) => {
let keys;
if (isChecked) {
keys = selectedRowKeys.filter((id) => id !== taskRecordId);
} else {
keys = [...selectedRowKeys, taskRecordId];
}
setSelectedRowKeys(keys);
// 更新全選checkbox的狀態(tài)值
const current = getCurrentCheckedList(keys, caseList);
setCheckAll(current?.length === limit); // limit表示每一頁展示的數(shù)量,checkAll是否為true也只是針對當前頁來說
setIndeterminate(!!current.length && current.length < limit);
};另外,在進行翻頁請求數(shù)據(jù)的時候,需要對當前頁的checkAll狀態(tài)值進行判斷,并初始化
// 當翻頁時,初始化【全選】選項
const currentPageCheckedList = getCurrentCheckedList(selectedRowKeys, resp_list); // resp_list表示接口返回的數(shù)據(jù)
setCheckAll(currentPageCheckedList?.length === limit);
setIndeterminate(!!currentPageCheckedList.length && currentPageCheckedList.length < limit);效果圖:

參考文檔:antd CheckBox實現(xiàn)全選、多選,antd checkbox全選
到此這篇關(guān)于react antd checkbox實現(xiàn)全選、多選功能的文章就介紹到這了,更多相關(guān)react antd checkbox全選 多選內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React使用React.lazy和Suspense實現(xiàn)組件懶加載
React 提供了 React.lazy 和 Suspense 這兩個好東西,能讓我們實現(xiàn)組件的懶加載,下面就跟隨小編一起來了解一下如何使用它們實現(xiàn)懶加載的具體步驟吧2025-03-03
React封裝高階組件實現(xiàn)路由權(quán)限的控制詳解
這篇文章主要介紹了React封裝高階組件實現(xiàn)路由權(quán)限的控制,在React中,為了實現(xiàn)安全可靠的路由權(quán)限控制,可以通過多種方式來確保只有經(jīng)過授權(quán)的用戶才能訪問特定路徑下的資源,下面來介紹封裝高階組件控制的方法,需要的朋友可以參考下2025-02-02
React?+?ECharts動態(tài)折線圖完整實現(xiàn)代碼
ECharts作為國內(nèi)最流行的可視化庫,其實內(nèi)置了非常強大的線條特效和動畫能力,這篇文章主要介紹了React + ECharts動態(tài)折線圖的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2026-03-03
阿里低代碼框架lowcode-engine設(shè)置默認容器詳解
這篇文章主要為大家介紹了阿里低代碼框架lowcode-engine設(shè)置默認容器詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
React實現(xiàn)下拉框的key,value的值同時傳送
這篇文章主要介紹了React實現(xiàn)下拉框的key,value的值同時傳送方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
react中將html字符串渲染到頁面的實現(xiàn)方式
這篇文章主要介紹了react中將html字符串渲染到頁面的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12

