Skip to content

复选框 Checkbox

这是多选题。

基础使用

复选框 Checkbox,传入 modelValue 进入受控模式。不传或者为 undefined 则为非受控模式,此时可以传入 defaultValue 属性作为默认值。

复选框 Checkbox 有两种样式变体,普通模式(normal,默认)和经典模式(retro)。经典模式的样式为致敬早期的游戏 UI 而设置。

<template>
	<px-space>
		<px-checkbox v-model="checked">Basic Checkbox</px-checkbox>
		<px-checkbox :default-value="true">Uncontrolled</px-checkbox>
		<px-checkbox label="Set Label By Prop"></px-checkbox>
		<px-checkbox variant="retro">Retro Style</px-checkbox>
		<px-checkbox variant="retro" :default-value="true">Retro Style Checked</px-checkbox>
	</px-space>
</template>

<script setup lang="ts">
import { ref } from 'vue'
const checked = ref(false)
</script>

禁用、只读状态

复选框 Checkbox,readonly 设置只读,disabled 设置禁用。此时内部 <input> 都会被设置 disabled,它们之间几乎只有样式不一样。

<template>
	<px-space direction="vertical">
		<px-space>
			<px-checkbox disabled :default-value="true">Checked</px-checkbox>
			<px-checkbox disabled>Unchecked</px-checkbox>
			<px-checkbox readonly :default-value="true">Checked Readonly</px-checkbox>
			<px-checkbox readonly>Unchecked Readonly</px-checkbox>
		</px-space>
		<px-space>
			<px-checkbox variant="retro" disabled :default-value="true">Checked</px-checkbox>
			<px-checkbox variant="retro" disabled>Unchecked</px-checkbox>
			<px-checkbox variant="retro" readonly :default-value="true">Checked Readonly</px-checkbox>
			<px-checkbox variant="retro" readonly>Unchecked Readonly</px-checkbox>
		</px-space>
	</px-space>
</template>

复选组

可以通过组合 CheckboxGroup 和 Checkbox 来形成一个复选组。

CheckboxGroup 的值为选中的 Checkbox 复选框组件的 value 组成的数组。

同样地,CheckboxGroup 传入 modelValue 进入受控模式。不传或者为 undefined 则为非受控模式,此时可以传入 defaultValue 属性作为默认值。

Retro Style

Readonly

Disabled

<template>
	<px-space direction="vertical">
		<px-checkbox-group v-model="group">
			<px-checkbox value="Abigail">Abigail</px-checkbox>
			<px-checkbox value="Harvey">Harvey</px-checkbox>
			<px-checkbox value="Leah">Leah</px-checkbox>
			<px-checkbox value="Maru">Maru</px-checkbox>
		</px-checkbox-group>
		<px-checkbox-group :default-value="['Elliott']">
			<px-checkbox value="Elliott">Elliott</px-checkbox>
			<px-checkbox value="Haley">Haley</px-checkbox>
			<px-checkbox value="Penny">Penny</px-checkbox>
			<px-checkbox value="Sebastian">Sebastian</px-checkbox>
		</px-checkbox-group>
		<h4>Retro Style</h4>
		<px-checkbox-group :default-value="['Dwarf']" variant="retro">
			<px-checkbox value="Dwarf">Dwarf</px-checkbox>
			<px-checkbox value="Krobus">Krobus</px-checkbox>
		</px-checkbox-group>
		<h4>Readonly</h4>
		<px-checkbox-group :default-value="['Sam']" readonly>
			<px-checkbox value="Sam">Sam</px-checkbox>
			<px-checkbox value="Shane">Shane</px-checkbox>
		</px-checkbox-group>
		<h4>Disabled</h4>
		<px-checkbox-group :default-value="['Alex']" disabled>
			<px-checkbox value="Alex">Alex</px-checkbox>
			<px-checkbox value="Clint">Clint</px-checkbox>
		</px-checkbox-group>
	</px-space>
</template>

<script setup lang="ts">
import { ref } from 'vue'
const group = ref<string[]>([])
</script>

半选中

Checkbox 的 indeterminatetrue 可以把复选框置为半选中状态,这个属性仅控制样式,和当前复选框的值无关。





<template>
	<px-switch v-model="retro" active-label="Retro" inactive-label="Normal"></px-switch>
	<br />
	<br />
	<px-checkbox
		:variant="retro ? 'retro' : 'normal'"
		v-model="all"
		@change="selectAllChangeHandler"
		:indeterminate="group.length > 0 && group.length < options.length"
		>Select All</px-checkbox
	>
	<br />
	<br />
	<px-checkbox-group
		v-model="group"
		@change="groupChangeHandler"
		:variant="retro ? 'retro' : 'normal'"
	>
		<px-checkbox v-for="option in options" :key="option" :value="option">
			{{ option }}
		</px-checkbox>
	</px-checkbox-group>
</template>

<script setup lang="ts">
import { ref } from 'vue'
const group = ref<string[]>([])
const all = ref(false)

const options = ['Blue Jazz', 'Carrot', 'Coffee Bean', 'Parsnip']

const selectAllChangeHandler = (value: boolean) => {
	if (value) {
		group.value = [...options]
	} else {
		group.value = []
	}
}

const groupChangeHandler = (value: string[]) => {
	if (value.length === options.length) {
		all.value = true
	} else {
		all.value = false
	}
}

const retro = ref(false)
</script>

垂直排列

CheckboxGroup 的 direction 属性用于设置子复选框的排列方向。



<template>
	<px-space>
		<px-switch
			v-model="vertical"
			active-label="Vertical"
			inactive-label="Horizontal"
		></px-switch>
		<px-switch v-model="retro" active-label="Retro" inactive-label="Normal"></px-switch>
	</px-space>
	<br />
	<br />
	<px-checkbox-group
		:direction="vertical ? 'vertical' : 'horizontal'"
		:variant="retro ? 'retro' : 'normal'"
	>
		<px-checkbox value="Anchovy">Anchovy</px-checkbox>
		<px-checkbox value="Tuna">Tuna</px-checkbox>
		<px-checkbox value="Sardine">Sardine</px-checkbox>
		<px-checkbox value="Bream">Bream</px-checkbox>
	</px-checkbox-group>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const vertical = ref(false)
const retro = ref(false)
</script>

复选框尺寸

Checkbox 和 CheckboxGroup 的 size 属性都可以用于设置复选框的尺寸。

Single Checkbox

Group

<template>
	<px-space direction="vertical">
		<h4>Single Checkbox</h4>
		<px-space>
			<px-checkbox size="small">Small</px-checkbox>
			<px-checkbox>Medium</px-checkbox>
			<px-checkbox size="large">Large</px-checkbox>
		</px-space>
		<px-space>
			<px-checkbox variant="retro" size="small">Small & Retro</px-checkbox>
			<px-checkbox variant="retro">Medium & Retro</px-checkbox>
			<px-checkbox variant="retro" size="large">Large & Retro</px-checkbox>
		</px-space>
		<h4>Group</h4>
		<px-checkbox-group :options="options" size="small"></px-checkbox-group>
		<px-checkbox-group :options="options"></px-checkbox-group>
		<px-checkbox-group :options="options" size="large"></px-checkbox-group>
	</px-space>
</template>

<script setup lang="ts">
const options = ['A', 'B', 'C', 'D']
</script>

选项属性

CheckboxGroup 的 options 属性用于直接传入选项,可以用于简单复选组的快速创建。



<template>
	<px-switch v-model="retro" active-label="Retro" inactive-label="Normal"></px-switch>
	<br />
	<br />
	<px-checkbox-group :options="options" :variant="retro ? 'retro' : 'normal'">
	</px-checkbox-group>
</template>

<script setup lang="ts">
import { ref } from 'vue'

const options = [
	'Lava Eel',
	'Ice Pip',
	{
		value: 'Midnight Carp',
		label: 'Midnight Carp',
		disabled: true
	},
	'Slimejack'
]

const retro = ref(false)
</script>

API

CheckboxProps

属性类型可选默认值描述版本
modelValueboolean | null复选框组件 Checkbox 的值(受控模式)。0.0.3
defaultValueboolean | null复选框组件 Checkbox 的默认值(非受控模式)。0.0.3
indeterminatebooleanfalse半选中状态。0.0.3
disabledbooleanfalse禁用状态。0.0.3
readonlybooleanfalse只读状态。0.0.3
variant'normal' | 'retro''normal'复选框的样式变体。0.0.3
labelstring复选框的文本。0.0.3
valueany复选框的原生 value 属性。0.0.3
size'medium' | 'large' | 'small''medium'复选框的大小。0.0.3

CheckboxEvents

事件参数描述版本
update:modelValuevalue: boolean更新 modelValue 的回调。0.0.3
inputvalue: boolean, event: InputEvent选中/取消选择复选框的回调。0.0.3
changevalue: boolean, event: Event复选框选中状态改变的回调。0.0.3
focusevent: FocusEvent复选框聚焦的回调。0.0.3
blurevent: FocusEvent复选框失去焦点的回调。0.0.3

CheckboxSlots

插槽参数描述版本
default复选框的文本。0.0.3

CheckboxGroupProps

属性类型可选默认值描述版本
modelValueany[] | null复选组组件 CheckboxGroup 的值(受控模式)。0.0.3
defaultValueany[] | null复选组组件 CheckboxGroup 的默认值(非受控模式)。0.0.3
disabledbooleanfalse禁用状态。0.0.3
readonlybooleanfalse只读状态。0.0.3
variant'normal' | 'retro'后代的单选框组件的样式变体,如果设置,优先于后代的单选框组件自身的 variant0.0.3
direction'horizontal' | 'vertical''horizontal'复选框子组件排列方向。0.0.3
options(CheckboxGroupOption | string)[]复选组选项。0.0.3
size'medium' | 'large' | 'small''medium'后代的复选框组件的尺寸大小,如果设置,优先于后代的复选框组件自身的 size0.0.3

CheckboxGroupEvents

事件参数描述版本
update:modelValuevalue: any[]更新 modelValue 的回调。0.0.3
changevalue: any[]复选组选中内容改变的回调。0.0.3

CheckboxGroupSlots

插槽参数描述版本
default复选框子组件。0.0.3

CheckboxGroupOption

ts
export interface Option<T = any> {
	value: T
	label: string
}

export interface CheckboxGroupOption<T = any> extends Option<T> {
	disabled?: boolean
	key?: string | number | symbol
}