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>

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-15 09:52:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-15 09:52:04       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-15 09:52:04       82 阅读
  4. Python语言-面向对象

    2023-12-15 09:52:04       91 阅读

热门阅读

  1. React - 实现一个支持TypeScript类型推导的 useRequest

    2023-12-15 09:52:04       66 阅读
  2. Node.js管理工具npm简单介绍

    2023-12-15 09:52:04       49 阅读
  3. el-select回显

    2023-12-15 09:52:04       66 阅读
  4. vue el-dialog封装成子组件

    2023-12-15 09:52:04       67 阅读
  5. Ubuntu安装MySQL未设置密码/修改密码/删除密码

    2023-12-15 09:52:04       57 阅读
  6. 安卓ViewPager最简单使用(另一种实现)

    2023-12-15 09:52:04       64 阅读
  7. 【09】ES6:Set 和 Map 数据结构

    2023-12-15 09:52:04       48 阅读
  8. Oracle日期加减

    2023-12-15 09:52:04       60 阅读
  9. SSX,一个有记忆的 ssh 客户端

    2023-12-15 09:52:04       57 阅读