Skip to main content

Checkbox 多选框

多选框允许用户从一组选项中选择多个选项。

何时使用

  • 在一组选项中进行多项选择时使用。
  • 单独使用可以表示两种状态之间的切换,和 switch 类似。区别在于切换 switch 会直接触发状态改变,而 checkbox 一般用于状态标记,需要和提交操作配合。

代码演示

基本用法

简单的 checkbox。

Live Editor
function BasicCheckboxDemo() {
  return (
    <Checkbox>Checkbox</Checkbox>
  );
}
Result
Loading...

不可用状态

Checkbox 不可用状态。

Live Editor
function DisabledCheckboxDemo() {
  return (
    <div className="flex flex-col space-y-4">
      <Checkbox disabled>不可用</Checkbox>
      <Checkbox disabled checked>不可用(已选中)</Checkbox>
    </div>
  );
}
Result
Loading...

受控组件

联动 checkbox。

Live Editor
function ControlledCheckboxDemo() {
  const [checked, setChecked] = React.useState(true);
  const [disabled, setDisabled] = React.useState(false);

  const toggleChecked = () => {
    setChecked(!checked);
  };

  const toggleDisable = () => {
    setDisabled(!disabled);
  };

  const onChange = (e) => {
    setChecked(e.target.checked);
  };

  const label = `${checked ? '选中' : '未选中'}-${disabled ? '不可用' : '可用'}`;

  return (
    <div className="flex flex-col space-y-4">
      <p className="mb-2">
        <Checkbox
          checked={checked}
          disabled={disabled}
          onChange={onChange}
        >
          {label}
        </Checkbox>
      </p>
      <div className="flex space-x-4">
        <Button type="primary" size="small" onClick={toggleChecked}>
          {!checked ? '选中' : '取消选中'}
        </Button>
        <Button type="primary" size="small" onClick={toggleDisable}>
          {!disabled ? '不可用' : '可用'}
        </Button>
      </div>
    </div>
  );
}
Result
Loading...

Checkbox 组

方便的从数组生成 Checkbox 组。

Live Editor
function CheckboxGroupDemo() {
  function onChange(checkedValues) {
    console.log('checked = ', checkedValues);
  }
  
  const plainOptions = ['Apple', 'Pear', 'Orange'];
  const options = [
    { label: '苹果', value: 'Apple' },
    { label: '梨', value: 'Pear' },
    { label: '橙子', value: 'Orange' }
  ];
  const optionsWithDisabled = [
    { label: '苹果', value: 'Apple' },
    { label: '梨', value: 'Pear' },
    { label: '橙子', value: 'Orange', disabled: true }
  ];
  
  return (
    <div className="flex flex-col space-y-8">
      <div>
        <h4 className="mb-2 text-gray-600">普通数组</h4>
        <Checkbox.Group options={plainOptions} defaultValue={['Apple']} onChange={onChange} />
      </div>
      
      <div>
        <h4 className="mb-2 text-gray-600">配置对象数组</h4>
        <Checkbox.Group options={options} defaultValue={['Pear']} onChange={onChange} />
      </div>
      
      <div>
        <h4 className="mb-2 text-gray-600">含禁用选项</h4>
        <Checkbox.Group options={optionsWithDisabled} defaultValue={['Apple']} onChange={onChange} />
      </div>
    </div>
  );
}
Result
Loading...

全选

实现全选/全不选功能。

Live Editor
function CheckAllDemo() {
  const plainOptions = ['Apple', 'Pear', 'Orange'];
  const [checkedList, setCheckedList] = React.useState(['Apple', 'Orange']);
  const [indeterminate, setIndeterminate] = React.useState(true);
  const [checkAll, setCheckAll] = React.useState(false);

  const onChange = (list) => {
    setCheckedList(list);
    setIndeterminate(!!list.length && list.length < plainOptions.length);
    setCheckAll(list.length === plainOptions.length);
  };

  const onCheckAllChange = (e) => {
    setCheckedList(e.target.checked ? plainOptions : []);
    setIndeterminate(false);
    setCheckAll(e.target.checked);
  };

  return (
    <div className="flex flex-col space-y-4">
      <div className="border-b pb-2">
        <Checkbox 
          indeterminate={indeterminate} 
          onChange={onCheckAllChange} 
          checked={checkAll}
        >
          全选
        </Checkbox>
      </div>
      <Checkbox.Group 
        options={plainOptions} 
        value={checkedList} 
        onChange={onChange} 
      />
    </div>
  );
}
Result
Loading...

布局

Checkbox.Group 内嵌 Checkbox 并与 Grid 组件一起使用可以实现灵活的布局。

Live Editor
function CheckboxLayoutDemo() {
  function onChange(checkedValues) {
    console.log('checked = ', checkedValues);
  }
  
  return (
    <Checkbox.Group onChange={onChange}>
      <div className="grid grid-cols-1 md:grid-cols-3 gap-4">
        <div>
          <Checkbox value="A">A</Checkbox>
        </div>
        <div>
          <Checkbox value="B">B</Checkbox>
        </div>
        <div>
          <Checkbox value="C">C</Checkbox>
        </div>
        <div>
          <Checkbox value="D">D</Checkbox>
        </div>
        <div>
          <Checkbox value="E">E</Checkbox>
        </div>
        <div>
          <Checkbox value="F">F</Checkbox>
        </div>
      </div>
    </Checkbox.Group>
  );
}
Result
Loading...

自定义样式

组件允许你采用自定义样式和 Tailwind 类名。

Live Editor
function CustomCheckboxDemo() {
  return (
    <div className="flex flex-col space-y-6">
      <Checkbox.Group className="bg-gray-100 p-4 rounded-md">
        <div className="flex flex-col space-y-2">
          <Checkbox value="1" className="text-blue-600">蓝色文本选项</Checkbox>
          <Checkbox value="2" className="text-red-600">红色文本选项</Checkbox>
          <Checkbox value="3" className="text-green-600">绿色文本选项</Checkbox>
        </div>
      </Checkbox.Group>
      
      <Checkbox className="checkbox-custom">
        <span className="font-bold text-purple-600">自定义样式选项</span>
      </Checkbox>
    </div>
  );
}
Result
Loading...

限制选择数量

限制选择的数量。

Live Editor
function LimitedCheckboxDemo() {
  const options = [
    { label: '选项 A', value: 'A' },
    { label: '选项 B', value: 'B' },
    { label: '选项 C', value: 'C' },
    { label: '选项 D', value: 'D' },
    { label: '选项 E', value: 'E' },
  ];

  const [checkedList, setCheckedList] = React.useState(['A', 'B']);
  const [disabledList, setDisabledList] = React.useState([]);
  
  const onChange = (list) => {
    setCheckedList(list);
    
    // 如果已经选择了2项,禁用其他未选择的选项
    if (list.length >= 2) {
      const disabled = options
        .filter(o => !list.includes(o.value))
        .map(o => o.value);
      setDisabledList(disabled);
    } else {
      // 否则清除禁用状态
      setDisabledList([]);
    }
  };

  // 修改options,添加disabled属性
  const optionsWithDisabled = options.map(option => ({
    ...option,
    disabled: disabledList.includes(option.value)
  }));

  return (
    <div className="flex flex-col space-y-4">
      <p>最多选择2项:</p>
      <Checkbox.Group
        options={optionsWithDisabled}
        value={checkedList}
        onChange={onChange}
      />
      <div>
        <p>已选择: {checkedList.join(', ')}</p>
      </div>
    </div>
  );
}
Result
Loading...

API

Checkbox

属性说明类型默认值
checked指定当前是否选中booleanfalse
defaultChecked初始是否选中booleanfalse
disabled失效状态booleanfalse
indeterminate设置 indeterminate 状态,只负责样式控制booleanfalse
onChange变化时的回调函数function(e:Event)-
className自定义类名string-

Checkbox.Group

属性说明类型默认值
defaultValue默认选中的选项string[][]
disabled整组失效booleanfalse
options指定可选项string[] | Array<{ label: string value: string disabled?: boolean }>[]
value指定选中的选项string[][]
onChange变化时的回调函数function(checkedValues)-
className自定义类名string-

设计指南

  1. Checkbox 多选框主要用于状态标记,需要与提交操作配合。
  2. 单独使用时可作为两种状态之间的切换,类似于开关按钮但具有不同的视觉效果。
  3. 多个选项组合使用时,可以从一组数据中选择多个值。
  4. 当选项数量过多时,可以考虑使用折叠面板或分组展示。

最佳实践

  1. 使用积极的表述方式来描述选择框标签,避免使用否定语句。
  2. 当存在大量选项时,考虑使用全选/取消全选功能简化用户操作。
  3. 对于有依赖关系的选项,可以使用级联选择或禁用相关选项的方式处理。
  4. 在表单中使用时,应与其他表单控件保持一致的对齐和间距。
  5. 若需要用户必须完成某个选择才能继续操作,请明确指示该多选框为必填项。