TinyVue Checkbox 复选框组件使用指南
组件介绍
Checkbox(复选框)是表单中常用的选择组件,用于在一组选项中进行多选。TinyVue 提供了完整的复选框体系,包括 Checkbox(复选框)、CheckboxGroup(复选框组)和 CheckboxButton(按钮式复选框)三个组件,支持配置式渲染、全选/半选、可选数量限制、过滤器模式、垂直布局、自定义颜色等丰富特性。
引入方式:
js
import { TinyCheckbox, TinyCheckboxGroup, TinyCheckboxButton } from '@opentiny/vue'
基本用法
通过 v-model 双向绑定选中状态(boolean),name 设置原生属性:
vue
<template>
<tiny-checkbox v-model="checked" name="agree">同意协议</tiny-checkbox>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckbox } from '@opentiny/vue'
const checked = ref(true)
</script>
复选框组
CheckboxGroup 将多个 Checkbox 管理为一组,通过 v-model 绑定选中值数组。每个 Checkbox 的 label 与数组中的值对应,存在则为选中状态:
vue
<template>
<tiny-checkbox-group v-model="checked">
<tiny-checkbox label="复选框 1"></tiny-checkbox>
<tiny-checkbox label="复选框 2"></tiny-checkbox>
<tiny-checkbox label="复选框 3"></tiny-checkbox>
</tiny-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckbox, TinyCheckboxGroup } from '@opentiny/vue'
const checked = ref(['复选框 1', '复选框 2'])
</script>
按钮式复选框
通过 CheckboxButton 以按钮形式展示复选框,用法与 Checkbox 相似,需在 CheckboxGroup 中使用:
vue
<template>
<tiny-checkbox-group v-model="checked">
<tiny-checkbox-button label="复选框 1"></tiny-checkbox-button>
<tiny-checkbox-button label="复选框 2"></tiny-checkbox-button>
<tiny-checkbox-button label="复选框 3"></tiny-checkbox-button>
</tiny-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckboxButton, TinyCheckboxGroup } from '@opentiny/vue'
const checked = ref(['复选框 1'])
</script>
配置式复选框组
通过 options 属性配置复选框组子项,无需在标签中手动插入 Checkbox 元素。配合 type 属性可切换为按钮形式:
vue
<template>
<!-- 普通复选框形式 -->
<tiny-checkbox-group v-model="checkList" type="checkbox" :options="options"></tiny-checkbox-group>
<!-- 按钮形式 -->
<tiny-checkbox-group v-model="checkList" type="button" :options="options"></tiny-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckboxGroup } from '@opentiny/vue'
const checkList = ref(['A'])
const options = ref([
{ label: 'A', text: '很好' },
{ label: 'B', text: '一般' },
{ label: 'C', text: '较差', disabled: true }
])
</script>
options 配置项类型 ICheckboxGroupOptions:
| 字段 | 类型 | 说明 |
|---|---|---|
label |
string |
选中时对应的值 |
text |
string |
描述文本 |
disabled |
boolean |
是否禁用 |
checked |
boolean |
是否默认选中 |
events |
{ click?, change? } |
原生事件回调 |
描述文本
复选框的描述文本有三种提供方式,优先级依次为:默认插槽 > text 属性 > label 属性:
vue
<template>
<tiny-checkbox-group v-model="checked">
<!-- 使用 label 作为描述 -->
<tiny-checkbox label="复选框 1"></tiny-checkbox>
<!-- 使用 text 属性覆盖 label 显示 -->
<tiny-checkbox label="复选框 2" text="自定义文本"></tiny-checkbox>
<!-- 使用默认插槽,优先级最高 -->
<tiny-checkbox label="复选框 3">插槽内容</tiny-checkbox>
</tiny-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckbox, TinyCheckboxGroup } from '@opentiny/vue'
const checked = ref(['复选框 1', '复选框 2', '复选框 3'])
</script>
禁用状态
通过 disabled 属性禁用单个复选框或整组:
vue
<template>
<!-- 禁用单个 -->
<tiny-checkbox v-model="checked" disabled>禁用复选框</tiny-checkbox>
<!-- 禁用整组 -->
<tiny-checkbox-group v-model="checked" disabled>
<tiny-checkbox label="选项 1"></tiny-checkbox>
<tiny-checkbox label="选项 2"></tiny-checkbox>
</tiny-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckbox, TinyCheckboxGroup } from '@opentiny/vue'
const checked = ref(true)
</script>
全选与半选
通过 indeterminate 属性设置半选状态(只负责样式控制),常与全选逻辑配合使用:
vue
<template>
<div>
<tiny-checkbox :indeterminate="isIndeterminate" v-model="checkAll">全选</tiny-checkbox>
<tiny-checkbox-group v-model="checkboxGroup">
<tiny-checkbox v-for="(city, index) in cities" :label="city" :key="index">
{{ city }}
</tiny-checkbox>
</tiny-checkbox-group>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
import { TinyCheckbox, TinyCheckboxGroup } from '@opentiny/vue'
const checkboxGroup = ref(['北京'])
const cities = ref(['上海', '北京', '广州', '深圳'])
// 半选状态:部分选中
const isIndeterminate = computed(() => {
return checkboxGroup.value.length > 0 && checkboxGroup.value.length !== cities.value.length
})
// 全选状态:双向计算属性
const checkAll = computed({
get() {
return checkboxGroup.value.length === cities.value.length
},
set(val) {
checkboxGroup.value = val ? [...cities.value] : []
}
})
</script>
可选数量限制
在 CheckboxGroup 上通过 min 和 max 属性限制可勾选项目的最小和最大数量:
vue
<template>
<tiny-checkbox-group v-model="checkboxGroup" :min="1" :max="2">
<tiny-checkbox v-for="city in cities" :label="city" :key="city">
{{ city }}
</tiny-checkbox>
</tiny-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckbox, TinyCheckboxGroup } from '@opentiny/vue'
const checkboxGroup = ref(['上海', '北京'])
const cities = ref(['上海', '北京', '广州', '深圳'])
</script>
当已选数量达到 max 时,未选的复选框自动禁用;当已选数量等于 min 时,已选的复选框不可取消。
默认勾选
CheckboxGroup 的 v-model 可以配置默认选中项,Checkbox 的 checked 属性同样可以配置默认选中:
vue
<template>
<!-- 通过 v-model 设置默认选中 -->
<tiny-checkbox-group v-model="checked">
<tiny-checkbox label="A"></tiny-checkbox>
<tiny-checkbox label="B"></tiny-checkbox>
</tiny-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckbox, TinyCheckboxGroup } from '@opentiny/vue'
const checked = ref(['A']) // A 默认选中
</script>
选中/未选中值
通过 true-label 和 false-label 设置选中与未选中时绑定的值,而非默认的 true/false:
vue
<template>
<tiny-checkbox
v-model="checked"
text="状态切换"
true-label="已启用"
false-label="已禁用"
></tiny-checkbox>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckbox } from '@opentiny/vue'
const checked = ref('已禁用')
</script>
尺寸
当复选框为按钮形式时,通过 CheckboxGroup 的 size 属性设置尺寸,可选值:medium、small、mini:
vue
<template>
<div>
<tiny-checkbox-group v-model="checkboxGroup" size="medium">
<tiny-checkbox-button v-for="city in cities" :label="city" :key="city">
{{ city }}
</tiny-checkbox-button>
</tiny-checkbox-group>
<tiny-checkbox-group v-model="checkboxGroup" size="small">
<tiny-checkbox-button v-for="city in cities" :label="city" :key="city">
{{ city }}
</tiny-checkbox-button>
</tiny-checkbox-group>
<tiny-checkbox-group v-model="checkboxGroup" size="mini">
<tiny-checkbox-button v-for="city in cities" :label="city" :key="city">
{{ city }}
</tiny-checkbox-button>
</tiny-checkbox-group>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckboxButton, TinyCheckboxGroup } from '@opentiny/vue'
const cities = ref(['上海', '北京', '广州', '深圳'])
const checkboxGroup = ref(['上海'])
</script>
过滤器模式
通过 shape 属性设置为 "filter" 启用过滤器模式,适用于筛选场景:
vue
<template>
<div>
<!-- 单个复选框过滤器 -->
<tiny-checkbox v-model="checked" shape="filter">筛选条件</tiny-checkbox>
<!-- 复选框组过滤器 -->
<tiny-checkbox-group v-model="checkedArr" shape="filter">
<tiny-checkbox label="条件 1"></tiny-checkbox>
<tiny-checkbox label="条件 2"></tiny-checkbox>
</tiny-checkbox-group>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckbox, TinyCheckboxGroup } from '@opentiny/vue'
const checked = ref(true)
const checkedArr = ref(['条件 1'])
</script>
垂直布局
在 CheckboxGroup 上设置 vertical 为 true,复选框将垂直排列:
vue
<template>
<tiny-checkbox-group v-model="checkboxGroup" vertical>
<tiny-checkbox v-for="(city, index) in cities" :label="city" :key="index">
{{ city }}
</tiny-checkbox>
</tiny-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckbox, TinyCheckboxGroup } from '@opentiny/vue'
const checkboxGroup = ref(['上海'])
const cities = ref(['上海', '北京', '广州', '深圳'])
</script>
自定义颜色
通过 CheckboxGroup 的 fill 属性自定义选中时的背景和边框颜色,text-color 自定义选中时的文本颜色:
vue
<template>
<tiny-checkbox-group v-model="checked" fill="#fa9841" text-color="#fff">
<tiny-checkbox-button label="复选框 1"></tiny-checkbox-button>
<tiny-checkbox-button label="复选框 2"></tiny-checkbox-button>
</tiny-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckboxButton, TinyCheckboxGroup } from '@opentiny/vue'
const checked = ref(['复选框 1'])
</script>
默认插槽
通过默认插槽自定义复选框的文本内容:
vue
<template>
<tiny-checkbox-group v-model="checked">
<tiny-checkbox label="复选框1">
<template #default>
<span style="color: #5e7ce0;">自定义样式文本</span>
</template>
</tiny-checkbox>
<tiny-checkbox label="复选框2">
<template #default>
<span style="color: #fa9841;">警告色文本</span>
</template>
</tiny-checkbox>
</tiny-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckbox, TinyCheckboxGroup } from '@opentiny/vue'
const checked = ref(['复选框 1'])
</script>
动态生成复选框组
复选框组数据可通过请求从后台获取,然后动态生成:
vue
<template>
<tiny-checkbox-group v-model="checked" @change="valueChange">
<tiny-checkbox-button v-for="item in list" :label="item.title" :key="item.id">
</tiny-checkbox-button>
</tiny-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckboxButton, TinyCheckboxGroup } from '@opentiny/vue'
const list = ref([])
const checked = ref([])
// 模拟异步请求
fetch('/api/cities').then(res => res.json()).then(data => {
list.value = data
checked.value = data.filter(item => item.checked).map(item => item.title)
})
function valueChange(val) {
console.log('当前选择:', val)
}
</script>
事件
| 事件名 | 回调参数 | 说明 |
|---|---|---|
change (Checkbox) |
`(value: string | number |
change (CheckboxGroup) |
`(value: string[] | number[])` |
vue
<template>
<tiny-checkbox-group v-model="checked" @change="valueChange">
<tiny-checkbox-button label="复选框 1"></tiny-checkbox-button>
<tiny-checkbox-button label="复选框 2"></tiny-checkbox-button>
</tiny-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckboxButton, TinyCheckboxGroup } from '@opentiny/vue'
const checked = ref(['复选框 1'])
function valueChange(val) {
console.log('选中值变化:', val)
}
</script>
只读态
通过 display-only 属性开启只显示模式,适用于详情页等非编辑场景:
vue
<template>
<tiny-checkbox v-model="checked" display-only>只读复选框</tiny-checkbox>
</template>
<script setup>
import { ref } from 'vue'
import { TinyCheckbox } from '@opentiny/vue'
const checked = ref(true)
</script>
API 参考
Checkbox Props
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| checked | boolean |
false |
是否默认勾选 |
| disabled | boolean |
false |
是否禁用 |
| display-only | string |
- | 是否开启只显示模式 |
| false-label | `string | number` | - |
| indeterminate | boolean |
false |
半选状态(仅样式控制) |
| label | `string | number | boolean` |
| modelValue / v-model | `string | number | boolean` |
| name | string |
- | 原生 name 属性 |
| shape | 'filter' |
- | 过滤器模式 |
| text | string |
- | 复选框显示文本 |
| true-label | `string | number` | - |
Checkbox Events
| 事件名 | 回调参数 | 说明 |
|---|---|---|
| change | `(value: string | number |
Checkbox Slots
| 插槽名 | 说明 |
|---|---|
| default | 自定义复选框内容 |
CheckboxGroup Props
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| disabled | boolean |
false |
是否禁用整组 |
| fill | string |
- | 按钮激活时的填充色和边框色 |
| max | number |
- | 可勾选的最大数量 |
| min | number |
- | 可勾选的最小数量 |
| modelValue / v-model | `string[] | number[]` | - |
| options | ICheckboxGroupOptions[] |
- | 子项配置列表 |
| shape | 'filter' |
- | 过滤器模式 |
| size | `'medium' | 'small' | 'mini'` |
| text-color | string |
- | 按钮激活时的文本颜色 |
| type | `'button' | 'checkbox'` | 'checkbox' |
| vertical | boolean |
false |
是否垂直排列 |
CheckboxGroup Events
| 事件名 | 回调参数 | 说明 |
|---|---|---|
| change | `(value: string[] | number[])` |
CheckboxGroup Slots
| 插槽名 | 说明 |
|---|---|
| default | 复选框组内容 |
CheckboxButton Props
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| checked | boolean |
false |
是否默认勾选 |
| disabled | boolean |
false |
是否禁用 |
| false-label | `string | number` | - |
| label | `string | number | boolean` |
| modelValue / v-model | `string | number | boolean` |
| name | string |
- | 原生 name 属性 |
| text | string |
- | 复选框文本 |
| true-label | `string | number` | - |
CheckboxButton Slots
| 插槽名 | 说明 |
|---|---|
| default | 按钮内容 |
最佳实践
-
优先使用 CheckboxGroup :多选场景始终使用 CheckboxGroup 包裹,通过
v-model统一管理选中值数组,避免逐个管理 boolean 状态。 -
配置式优于插槽式 :当选项数据来自接口或配置时,使用
options属性配置式渲染,代码更简洁、更易维护。 -
全选逻辑用 computed :全选/半选场景使用
computed的 getter/setter 实现双向计算属性,逻辑清晰且自动同步。 -
min/max 限制选择数 :使用
min和max属性限制可选数量,比手动校验更优雅,组件会自动禁用不可选的复选框。 -
按钮形式用于工具栏:CheckboxButton 适合工具栏、标签筛选等场景;普通 Checkbox 适合表单、设置项等场景。
-
过滤器模式用于筛选 :搜索筛选场景使用
shape="filter"过滤器模式,视觉上更贴合筛选交互。 -
垂直布局节省空间 :选项较多或水平空间有限时,使用
vertical垂直排列,避免水平溢出。 -
自定义颜色统一品牌 :使用
fill和text-color统一按钮式复选框的选中颜色,保持品牌一致性。
OpenTiny NEXT 是一套企业智能前端开发解决方案,以生成式 UI 和 WebMCP 两大核心技术为基础,对现有传统的 TinyVue 组件库、TinyEngine 低代码引擎等产品进行智能化升级,构建出面向 Agent 应用的前端 NEXT-SDKs、AI Extension、TinyRobot智能助手、GenUI等新产品,实现AI理解用户意图自主完成任务,加速企业应用的智能化改造。