Checkbox 复选框
多选框 —— 3 种尺寸、indeterminate 半选状态,原生 input 语义保留。
基础用法
底层是真实的 <CfInput type="checkbox">,键盘 / 表单 / 屏幕阅读器全部直接可用。
<script setup lang="ts">
import { ref } from 'vue';
import { CfCheckbox } from '@chufix-design/vue';
const agree = ref(false);
</script>
<template>
<CfCheckbox v-model="agree">我同意服务协议</CfCheckbox>
</template> import { useState } from 'react';
import { CfCheckbox } from '@chufix-design/react';
export default function Demo() {
const [agree, setAgree] = useState(false);
return (
<CfCheckbox checked={agree} onChange={(e) => setAgree(e.target.checked)}>
我同意服务协议
</CfCheckbox>
);
} 尺寸与禁用
<CfCheckbox size="sm" :model-value="true">sm 已选</CfCheckbox>
<CfCheckbox size="md" :model-value="true">md 已选</CfCheckbox>
<CfCheckbox size="lg" :model-value="true">lg 已选</CfCheckbox>
<CfCheckbox disabled>禁用</CfCheckbox>
<CfCheckbox disabled :model-value="true">禁用已选</CfCheckbox> <CfCheckbox size="sm" defaultChecked>sm 已选</CfCheckbox>
<CfCheckbox size="md" defaultChecked>md 已选</CfCheckbox>
<CfCheckbox size="lg" defaultChecked>lg 已选</CfCheckbox>
<CfCheckbox disabled>禁用</CfCheckbox>
<CfCheckbox disabled defaultChecked>禁用已选</CfCheckbox> 半选 indeterminate
indeterminate 是纯视觉状态,不影响实际的 checked 值。常见用法是父级 “全选” 在子项部分选中时显示。
<script setup lang="ts">
import { computed, ref } from 'vue';
import { CfCheckbox } from '@chufix-design/vue';
const apple = ref(true);
const banana = ref(false);
const cherry = ref(false);
const count = computed(
() => [apple.value, banana.value, cherry.value].filter(Boolean).length,
);
const all = computed({
get: () => count.value === 3,
set(v) { apple.value = v; banana.value = v; cherry.value = v; },
});
const indeterminate = computed(() => count.value > 0 && count.value < 3);
</script>
<template>
<CfCheckbox v-model="all" :indeterminate="indeterminate">全选</CfCheckbox>
<CfCheckbox v-model="apple">苹果</CfCheckbox>
<CfCheckbox v-model="banana">香蕉</CfCheckbox>
<CfCheckbox v-model="cherry">樱桃</CfCheckbox>
</template> import { useState } from 'react';
import { CfCheckbox } from '@chufix-design/react';
export default function Demo() {
const [apple, setApple] = useState(true);
const [banana, setBanana] = useState(false);
const [cherry, setCherry] = useState(false);
const count = [apple, banana, cherry].filter(Boolean).length;
return (
<>
<CfCheckbox
checked={count === 3}
indeterminate={count > 0 && count < 3}
onChange={(e) => {
const v = e.target.checked;
setApple(v); setBanana(v); setCherry(v);
}}
>全选</CfCheckbox>
<CfCheckbox checked={apple} onChange={(e) => setApple(e.target.checked)}>苹果</CfCheckbox>
<CfCheckbox checked={banana} onChange={(e) => setBanana(e.target.checked)}>香蕉</CfCheckbox>
<CfCheckbox checked={cherry} onChange={(e) => setCherry(e.target.checked)}>樱桃</CfCheckbox>
</>
);
} 事件与表单
change 除了返回 checked,也会给出 name / value / indeterminate 等 meta,方便做权限矩阵、批量选择和原生表单提交。
mixed
切换权限后会显示 checked、name、value 与 indeterminate。<CfCheckbox
v-model="checked"
name="permissions"
value="read"
:indeterminate="partial"
@change="(checked, meta) => console.log(checked, meta)"
>
读取
</CfCheckbox> <CfCheckbox
checked={checked}
name="permissions"
value="read"
indeterminate={partial}
onCheckedChange={(checked, meta) => console.log(checked, meta)}
onChange={(event) => setChecked(event.target.checked)}
>
读取
</CfCheckbox> API
| Prop | 类型 | 默认值 | 说明 |
|---|---|---|---|
size | 'sm' | 'md' | 'lg' | 'md' | 整体尺寸 |
disabled | boolean | false | 禁用 |
indeterminate | boolean | false | 半选状态(视觉态,不影响 checked) |
name | string | — | 原生 input name |
value | string | number | — | 原生 input value |
Events
| Vue 事件 | React 回调 | payload | 说明 |
|---|---|---|---|
change | onCheckedChange | (checked, { event, checked, indeterminate, value, name }) | 选中状态变化 |
focus / blur | onFocus / onBlur | FocusEvent | 原生焦点事件 |
反馈与讨论
Checkbox 复选框 的讨论