react antd checkbox实现全选、多选功能

 更新时间:2024年07月11日 10:28:43   作者:a堅強的泡沫  
目前好像只有table组件有实现表格数据的全选功能,如果说对于list,card,collapse等其他组件来说,需要自己结合checkbox来手动实现全选功能,这篇文章主要介绍了react antd checkbox实现全选、多选功能,需要的朋友可以参考下

背景

目前好像只有table组件有实现表格数据的全选功能,如果说对于list,card,collapse等其他组件来说,需要自己结合checkbox来手动实现全选功能。

Checkbox.Group有实现全选功能,但是对于需要遍历出来的数据(接口动态返回),这种方式不太可行。

方案

考虑都使用checkbox组件来实现,同时增加状态管理。

1、增加一个【全选】checkbox,同时遍历每一行数据的时候,为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、增加需要的状态

  const [selectedRowKeys, setSelectedRowKeys] = useState<number[]>([]); // 勾选的每一行数据的id集合
  const [indeterminate, setIndeterminate] = useState(false); // 【全选】checkbox
  const [checkAll, setCheckAll] = useState(false); // 【全选】checkbox

3、当点击【全选】checkbox的时候

  • 全部勾选:把当前页的item.id和已有的selectedRowKeys一起存起来,注意id去重
  • 取消全部勾选:setSelectedRowKeys([])
  • 同时改变checkAll的状态
  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、当点击【每一行数据的checkbox】的时候

  • 首选需要判断该行数据是否已经被勾选上:const isChecked = selectedRowKeys?.includes(item.task_record_id);
  • 如果已经被勾选上了,说明需要取消勾选,则从selectedRowKeys去除掉该id;否则,为selectedRowKeys添加上该id。
  • 考虑分页的时候,selectedRowKeys需要存放 上一页已勾选的id 和 当前页已勾选的id
  • 然后再用 当前页已勾选的id列表 去判断 checkAll 和 indeterminate【全选checkbox】的状态值
// 获取当前页已勾选的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;
};
// 点击每一项数据前面checkbox时
const handleClickItemCheckbox = (isChecked: boolean, taskRecordId: number) => {
  let keys;
  if (isChecked) {
    keys = selectedRowKeys.filter((id) => id !== taskRecordId);
  } else {
    keys = [...selectedRowKeys, taskRecordId];
  }
  setSelectedRowKeys(keys);
  // 更新全选checkbox的状态值
  const current = getCurrentCheckedList(keys, caseList);
  setCheckAll(current?.length === limit); // limit表示每一页展示的数量,checkAll是否为true也只是针对当前页来说
  setIndeterminate(!!current.length && current.length < limit);
};

另外,在进行翻页请求数据的时候,需要对当前页的checkAll状态值进行判断,并初始化

        // 当翻页时,初始化【全选】选项
        const currentPageCheckedList = getCurrentCheckedList(selectedRowKeys, resp_list); // resp_list表示接口返回的数据
        setCheckAll(currentPageCheckedList?.length === limit);
        setIndeterminate(!!currentPageCheckedList.length && currentPageCheckedList.length < limit);

效果图:

参考文档:antd CheckBox实现全选、多选antd checkbox全选

到此这篇关于react antd checkbox实现全选、多选功能的文章就介绍到这了,更多相关react antd checkbox全选 多选内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈React 属性和状态的一些总结

    浅谈React 属性和状态的一些总结

    下面小编就为大家带来一篇浅谈React 属性和状态的一些总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • React使用React.lazy和Suspense实现组件懒加载

    React使用React.lazy和Suspense实现组件懒加载

    React 提供了 React.lazy 和 Suspense 这两个好东西,能让我们实现组件的懒加载,下面就跟随小编一起来了解一下如何使用它们实现懒加载的具体步骤吧
    2025-03-03
  • React事件处理的机制及原理

    React事件处理的机制及原理

    这篇文章主要介绍了React事件处理的机制及原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • React封装高阶组件实现路由权限的控制详解

    React封装高阶组件实现路由权限的控制详解

    这篇文章主要介绍了React封装高阶组件实现路由权限的控制,在React中,为了实现安全可靠的路由权限控制,可以通过多种方式来确保只有经过授权的用户才能访问特定路径下的资源,下面来介绍封装高阶组件控制的方法,需要的朋友可以参考下
    2025-02-02
  • React 19 竞态问题解决

    React 19 竞态问题解决

    本文主要介绍了React 19 竞态问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-05-05
  • React + ECharts动态折线图完整实现代码

    React + ECharts动态折线图完整实现代码

    ECharts作为国内最流行的可视化库,其实内置了非常强大的线条特效和动画能力,这篇文章主要介绍了React + ECharts动态折线图的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-03-03
  • 阿里低代码框架lowcode-engine设置默认容器详解

    阿里低代码框架lowcode-engine设置默认容器详解

    这篇文章主要为大家介绍了阿里低代码框架lowcode-engine设置默认容器详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 学习React中ref的两个demo示例

    学习React中ref的两个demo示例

    这篇文章主要介绍了学习React中ref的两个demo示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • React实现下拉框的key,value的值同时传送

    React实现下拉框的key,value的值同时传送

    这篇文章主要介绍了React实现下拉框的key,value的值同时传送方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • react中将html字符串渲染到页面的实现方式

    react中将html字符串渲染到页面的实现方式

    这篇文章主要介绍了react中将html字符串渲染到页面的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论