react经验8:使用antd的checkbox实现全选与半选控制

预期实现的效果
在这里插入图片描述
列表项部分选中时,checkall处于半选状态,点击checkall要么全选,要么全不选。

实现步骤

列表项类型

declare type TableRow = {
    key: Key
    title: string
    isSelected?: boolean
}

示范数据

const [tabledata, setTabledata] = useState<TableRow[]>([])
useEffect(()=>{
	setTabledata([
		{key:1,title:'Apple'},
		{key:2,title:'Pear'},
		{key:3,title:'Orange'}
	])
},[])

核心控制函数

//半选状态
const halfChecked = useMemo(() => {
        if (!tabledata.length) {
            return false
        }
        let checkeds = tabledata.filter(d => d.isSelected).length
        return checkeds > 0 && checkeds < tabledata.length
    }, [tabledata])
//全选状态
const allChecked = useMemo(() => {
    if (!tabledata.length) {
        return false
    }
    return tabledata.every(d => d.isSelected)
}, [tabledata])
//全选控制,点一下全选或全不选
function handleCheckAll(e: CheckboxChangeEvent) {
        if (e.target.checked) {
            tabledata.forEach(d => d.isSelected = true)
        } else {
            tabledata.forEach(d => d.isSelected = false)
        }
        setTabledata([...tabledata])
}
//列表项选中改变事件
function handleItemSelect(item:TableRow){
	item.isSelected =!item.isSelected 
	setTabledata([...tabledata])
}  

视图部分

<Checkbox indeterminate={halfChecked} checked={allChecked} onChange={handleCheckAll}>Check All</Checkbox>
<ul>
{
	tabledata.map(row=>(
		<li key={row.key}>
			<Checkbox checked={row.isSelected} onChange={()=>handleItemSelect(row)}>{row.title}</Checkbox>
		</li>
	))
}
</ul>
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值