react函数组件+antd实现多选框全选取消全选单选功能

这篇博客详细介绍了如何使用React实现一个全选和多选标签的功能。通过`useState`管理状态,结合`Checkbox`和`Form`组件,创建了一个可以进行单选和全选操作的标签选择器。示例代码展示了从状态初始化到事件处理的完整流程,适用于前端UI交互开发。
摘要由CSDN通过智能技术生成

import React, {FC,useState} from "react";
import { Checkbox, Divider, Form} from "antd";


const newPortrait: FC = () => {
    const [chooseLabel, setChooseLabel] = useState<Array<any>>([]) // 选择的多选标签
    const [checkAll, switchCheckAll] = useState<boolean>(false); // 全选flag
    const [indeterminate, setIndeterminate] = useState<boolean>(false);
    const [labelsList, setLabelsList] = useState<any[]>([]);  // 标签列表
    const [initLabels, setInitLabels] = useState<any[]>([]);  // 全部的标签labelKey组成的列表

    // 单选
    const checkThis = (e: any) => {
        setChooseLabel(e);
        setIndeterminate(!!chooseLabel.length && chooseLabel.length < initLabels.length);
        switchCheckAll(chooseLabel.length === initLabels.length);
    };
    // 全选
    const onCheckAllChange = (e: any, type: number) => {
        setChooseLabel(e.target.checked ? initLabels : []);
        setIndeterminate(false);
        switchCheckAll(e.target.checked);
    };

    return (
        <div className="new-box">
            <div className="label-select">
                <div className="choose-group">
                    <Checkbox
                        className="choose-all"
                        indeterminate={indeterminate}
                        onClick={(e) => onCheckAllChange(e, 0)}
                        checked={checkAll}>
                        全选
                    </Checkbox>
                    <span className="choose-none" onClick={(e) => {
                        switchCheckAll(false);
                        onCheckAllChange(e, 1)
                    }}>清除选择</span>
                </div>
                <Divider className="divider"/>
                <div className='lb_cate'>
                    <Form
                        className="label-form"
                        labelCol={{span: 3}}
                        wrapperCol={{span: 21}}
                    >
                        <Checkbox.Group value={chooseLabel} onChange={e => checkThis(e)}>
                            {
                                labelsList.map((item: any, index: number) => {
                                    return (
                                        <Form.Item label={item.labelCategory.labelName} key={index}
                                                   className="one-part">

                                            {
                                                item.labels.map((iv: any, index: number) => {
                                                    return (
                                                        <Checkbox
                                                            className="single-label"
                                                            key={iv.id}
                                                            value={iv.labelKey}
                                                        >
                                                            <span key={iv.labelCode}>{iv.labelName}</span>
                                                        </Checkbox>
                                                    )
                                                })
                                            }
                                        </Form.Item>
                                    )
                                })
                            }
                        </Checkbox.Group>
                    </Form>
                </div>
            </div>

        </div>

    )
}

export default newPortrait

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值