Checkbox 复选框
用于在一组备选项中进行多选。
❗ 警告
该组件在设计上没有使用到 HTML 的 Input 元素。
基础用法
使用标签 <NueCheckbox> 声明一个复选框组件。
值和标识文字
通过 v-model 绑定复选框的值;通过属性 label 或默认插槽 #default 设置复选框的标识文本。
<template>
<nue-div>
<nue-checkbox v-model="state" />
<nue-checkbox v-model="state" label="复选框" />
<nue-checkbox v-model="state">复选框</nue-checkbox>
</nue-div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const state = ref(false);
</script>禁用状态
通过属性 disabled 禁用复选框。
<template>
<nue-div>
<nue-checkbox v-model="state1" disabled label="禁用状态(未选)" />
<nue-checkbox v-model="state2" disabled label="禁用状态(已选)" />
</nue-div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const state1 = ref(false);
const state2 = ref(true);
</script>大小
通过属性 size 来设置复选框的大小。属性可选值为 small 和 large。
<template>
<nue-div align="center">
<nue-checkbox v-model="state1" label="小型复选框" size="small" />
<nue-checkbox v-model="state2" label="正常复选框" />
<nue-checkbox v-model="state3" label="大型复选框" size="large" />
</nue-div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const state1 = ref(false);
const state2 = ref(false);
const state3 = ref(false);
</script>中间状态
通过属性 indeterminate 设置复选框为中间状态。
TIP
- 属性
indeterminate表示有选择项但不是全选的中间状态,通常会在控制整体选项组的复选框上应用。 - 属性
indeterminate的显示优先级会低于选中值为true、高于选中值为false的情况。
<template>
<nue-div>
<nue-checkbox v-model="state1" label="未选中" />
<nue-checkbox v-model="state2" indeterminate label="中间状态" />
<nue-checkbox v-model="state3" indeterminate label="已选中" />
</nue-div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const state1 = ref(false);
const state2 = ref(false);
const state3 = ref(true);
</script>加载态和值变更前的回调函数
通过属性 loading 设置复选框处于加载状态。通常搭配状态变更前的回调函数属性 before-check 使用。在 before-switch 回调函数中,只有返回 Resolved Promise 或是 ture 时才会使开关组件的状态发生改变。
<template>
<nue-checkbox
v-model="state"
:before-check="handleBeforeCheck"
:label="label"
:loading="loading"
/>
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue';
const state = ref(false);
const loading = ref(false);
const label = computed(() => {
if (loading.value) return '处理中...';
return state.value ? '已选中' : '未选中';
});
const handleBeforeCheck = () => {
loading.value = true;
return new Promise(resolve => {
setTimeout(() => {
loading.value = false;
resolve(true);
}, 2000);
});
};
</script>复选框组
复选框组能够统一控制和记录多个复选框的选中以及其他属性,适用于多个勾选框绑定到同一个数组的情景,通过是否勾选来表示这一组选项中选中的项。
使用标签 <NueCheckboxGroup> 声明一个复选框组。
建议为每个 <NueCheckbox> 复选框组件指定 name 属性,通过 v-model 在 <NueCheckboxGroup> 上绑定一个复选框组的响应式值,该值将会记录下所有已选择的 <NueCheckbox> 复选框组件的 name 属性值。
TIP
若 <NueCheckbox> 复选框组件没有指定 name 属性值,则内部将随机生成由 4 个字符组成的随机字符串作为 name 默认属性值。
<template>
<nue-checkbox-group v-model="activeNames">
<nue-div gap="12px">
<nue-checkbox v-for="name in checkboxes" :key="name" :label="name" :name="name" />
<nue-checkbox label="未命名复选框" />
</nue-div>
</nue-checkbox-group>
<nue-text>已选中:{{ activeNames.join(', ') || 'none' }}</nue-text>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const checkboxes = ['游戏', '音乐', '电影'];
const activeNames = ref([]);
</script>禁用状态
通过属性 disabled 控制组内 <NueCheckbox> 复选框组件的禁用状态。
<template>
<nue-div vertical>
<nue-checkbox-group v-model="activeNames" disabled>
<nue-div gap="12px">
<nue-checkbox v-for="name in checkboxes" :key="name" :label="name" :name="name" />
</nue-div>
</nue-checkbox-group>
</nue-div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const checkboxes = ['游戏', '音乐', '电影'];
const activeNames = ref(['音乐']);
</script>大小
通过属性 size 控制组内 <NueCheckbox> 复选框组件的大小,可选值与 <NueCheckbox> 复选框组件的属性 size 相同。
<template>
<nue-div vertical>
<nue-checkbox-group v-model="activeNames" size="small">
<nue-div gap="12px">
<nue-checkbox v-for="name in checkboxes" :key="name" :label="name" :name="name" />
</nue-div>
</nue-checkbox-group>
</nue-div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const checkboxes = ['游戏', '音乐', '电影'];
const activeNames = ref(['音乐']);
</script>控制器
通过属性 useController 开启复选框组的预设选择控制器。通过属性 controllerLabel 设置控制器标识文本。
<template>
<nue-checkbox-group v-model="activeNames" controller-label="全选" use-controller>
<nue-div gap="12px">
<nue-checkbox v-for="name in checkboxes" :key="name" :label="name" :name="name" />
</nue-div>
</nue-checkbox-group>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
const checkboxes = ['游戏', '音乐', '电影', '运动', '旅行'];
const activeNames = ref<string[]>(['游戏', '音乐']);
</script>最小和最大选中数
通过属性 min 和 max 指定复选框组内 <NueCheckbox> 复选框组件的最小和最大选中数。属性接受 Number 类型,默认值分别为 min=0 和 max=Infinity。
<template>
<nue-checkbox-group
v-model="activeNames"
:controller-label="controllerLabel"
:max="3"
:min="1"
use-controller
>
<nue-div gap="12px">
<nue-checkbox v-for="name in checkboxes" :key="name" :label="name" :name="name" />
</nue-div>
</nue-checkbox-group>
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue';
const checkboxes = ['游戏', '音乐', '电影', '运动', '旅行'];
const activeNames = ref<string[]>(['游戏', '音乐']);
const controllerLabel = computed(() => {
return `已选择 ${activeNames.value.length} 项,总共可选 3 项`;
});
</script>