n-checkbox Component
The n-checkbox component is used for binary selections and multiple selections within groups. It supports indeterminate states, custom checked/unchecked values, and integrates well with grid layouts for complex form scenarios.
When to Use
Use n-checkbox when you need to:
- Allow users to select one or more options from a list
- Create binary toggle controls (yes/no, on/off)
- Implement "select all" functionality with indeterminate state
- Build grid-based selection interfaces
- Collect multiple values in forms
- Create controlled checkbox states
Basic Usage
Basic Checkbox
<template>
<n-checkbox v-model:checked="checked">
Checkbox Label
</n-checkbox>
</template>
<script setup>
import { ref } from 'vue'
const checked = ref(false)
</script>
Checkbox Group
<template>
<n-checkbox-group v-model:value="cities">
<n-space item-style="display: flex;">
<n-checkbox value="Beijing" label="Beijing" />
<n-checkbox value="Shanghai" label="Shanghai" />
<n-checkbox value="Guangzhou" label="Guangzhou" />
<n-checkbox value="Shenzhen" label="Shenzhen" />
</n-space>
</n-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
const cities = ref(['Beijing'])
</script>
Different Sizes
<template>
<n-space item-style="display: flex;" align="center">
<n-checkbox size="small" label="Small" />
<n-checkbox size="medium" label="Medium" />
<n-checkbox size="large" label="Large" />
</n-space>
</template>
API Reference
Checkbox Props
| Name | Type | Default | Description |
|---|---|---|---|
checked / v-model:checked |
boolean |
false |
Whether the checkbox is checked. |
checked-value |
string | boolean | number |
true |
Value of checked state. |
default-checked |
boolean |
false |
Whether the checkbox is checked by default. |
disabled |
boolean |
false |
Whether the checkbox is disabled. |
focusable |
boolean |
true |
Whether the checkbox gains focus after being checked. |
indeterminate |
boolean |
false |
Whether the checkbox has indeterminate state. |
label |
string |
undefined |
Checkbox label. |
size |
'small' | 'medium' | 'large' |
'medium' |
The size of the checkbox. |
unchecked-value |
string | boolean | number |
false |
Value of unchecked state. |
value |
string | number |
undefined |
The value used in a checkbox group. |
CheckboxGroup Props
| Name | Type | Default | Description |
|---|---|---|---|
value / v-model:value |
Array<string | number> | null |
undefined |
Selected values of the group. |
default-value |
Array<string | number> |
null |
Default selected values. |
disabled |
boolean |
false |
Whether the group is disabled. |
max |
number |
undefined |
Maximum number of checkboxes that can be checked. |
min |
number |
undefined |
Minimum number of checkboxes that can be checked. |
Events
Checkbox Events
| Name | Parameters | Description |
|---|---|---|
update:checked |
(checked: boolean) |
Triggered when checked state changes. |
CheckboxGroup Events
| Name | Parameters | Description |
|---|---|---|
update:value |
(value: (string | number)[], meta: { actionType, value }) |
Triggered when value changes. |
Slots
Checkbox Slots
| Name | Parameters | Description |
|---|---|---|
default |
() |
Content of the checkbox (label). |
CheckboxGroup Slots
| Name | Parameters | Description |
|---|---|---|
default |
() |
Content of the checkbox group. |
Methods
| Name | Type | Description |
|---|---|---|
focus |
() => void |
Focus the checkbox. |
blur |
() => void |
Blur the checkbox. |
Common Patterns
Indeterminate State (Select All)
<template>
<n-space item-style="display: flex;" vertical>
<n-checkbox
v-model:checked="allChecked"
:indeterminate="indeterminate"
@update:checked="handleAllChecked"
>
Select All
</n-checkbox>
<n-checkbox-group v-model:value="cities">
<n-space item-style="display: flex;">
<n-checkbox value="Beijing" label="Beijing" />
<n-checkbox value="Shanghai" label="Shanghai" />
<n-checkbox value="Guangzhou" label="Guangzhou" />
<n-checkbox value="Shenzhen" label="Shenzhen" />
</n-space>
</n-checkbox-group>
</n-space>
</template>
<script setup>
import { ref, computed, watch } from 'vue'
const allCities = ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen']
const cities = ref([])
const allChecked = computed({
get: () => cities.value.length === allCities.length,
set: (val) => {
cities.value = val ? [...allCities] : []
}
})
const indeterminate = computed(() => {
return cities.value.length > 0 && cities.value.length < allCities.length
})
const handleAllChecked = (checked) => {
cities.value = checked ? [...allCities] : []
}
</script>
Grid Layout
<template>
<n-checkbox-group v-model:value="selected">
<n-grid :y-gap="8" :cols="2">
<n-gi>
<n-checkbox value="option1" label="Option 1" />
</n-gi>
<n-gi>
<n-checkbox value="option2" label="Option 2" />
</n-gi>
<n-gi>
<n-checkbox value="option3" label="Option 3" />
</n-gi>
<n-gi>
<n-checkbox value="option4" label="Option 4" />
</n-gi>
</n-grid>
</n-checkbox-group>
</template>
<script setup>
import { ref } from 'vue'
const selected = ref([])
</script>
Custom Checked Values
<template>
<n-checkbox
v-model:checked="status"
checked-value="active"
unchecked-value="inactive"
>
Status: {{ status }}
</n-checkbox>
</template>
<script setup>
import { ref } from 'vue'
const status = ref('inactive')
</script>
Controlled Checkbox
<template>
<n-space align="center" item-style="display: flex;">
<n-checkbox :checked="checked">
Controlled Checkbox
</n-checkbox>
<n-switch v-model:value="checked" />
</n-space>
</template>
<script setup>
import { ref } from 'vue'
const checked = ref(false)
</script>
Min/Max Selection Limits
<template>
<n-checkbox-group v-model:value="selected" :min="1" :max="3">
<n-space item-style="display: flex;">
<n-checkbox value="1" label="Option 1" />
<n-checkbox value="2" label="Option 2" />
<n-checkbox value="3" label="Option 3" />
<n-checkbox value="4" label="Option 4" />
</n-space>
</n-checkbox-group>
<p>Select between 1 and 3 options (currently: {{ selected.length }})</p>
</template>
<script setup>
import { ref } from 'vue'
const selected = ref(['1'])
</script>
Using Methods via Ref
<template>
<n-space item-style="display: flex; align-items: center;">
<n-button @click="handleClick">
Focus then blur in 1 second
</n-button>
<n-checkbox ref="checkboxRef" label="Controlled via ref" />
</n-space>
</template>
<script setup>
import { ref } from 'vue'
const checkboxRef = ref(null)
const handleClick = () => {
checkboxRef.value?.focus()
setTimeout(() => {
checkboxRef.value?.blur()
}, 1000)
}
</script>
Event Handling
<template>
<n-space item-style="display: flex;" vertical>
<n-checkbox
v-model:checked="checked"
label="Event Demo"
@update:checked="handleCheckedChange"
/>
<n-checkbox-group v-model:value="selected" @update:value="handleGroupChange">
<n-space item-style="display: flex;">
<n-checkbox value="A" label="A" />
<n-checkbox value="B" label="B" />
</n-space>
</n-checkbox-group>
</n-space>
</template>
<script setup>
import { ref } from 'vue'
const checked = ref(false)
const selected = ref([])
const handleCheckedChange = (val) => {
console.log('Checkbox changed:', val)
}
const handleGroupChange = (value, meta) => {
console.log('Group changed:', value, meta.actionType, meta.value)
}
</script>
Best Practices
Use
v-model:checkedfor single checkbox: For cleaner code when working with a single checkbox.Use
n-checkbox-groupfor multiple related options: This provides better value management and enables min/max constraints.Implement indeterminate state for "select all": Use the
indeterminateprop to show partial selection state.Use custom values for non-boolean data: When your data model uses specific values instead of boolean, use
checked-valueandunchecked-value.Set
focusable: falsefor click-only interactions: When keyboard focus is not needed, disable focusability.Use
minandmaxfor validation: Enforce selection constraints at the group level for better UX.Leverage grid layouts for complex forms: Combine with
n-gridfor multi-column checkbox layouts.Handle events for side effects: Use
@update:checkedand@update:valuefor triggering actions on selection changes.