简介
MtSegmented
是一个用于分段选择的 Vue 组件。它支持多种数据类型、图标显示、禁用状态等功能,适用于需要用户在多个选项中做出单个选择的场景。
基本用法
Segmented 组件通过模板方式使用,需要提供 options
数组和 v-model
绑定值。
基本用法
最基本的分段器,用于在多个选项中选择一个。
提供选项数组和 v-model 绑定值即可创建基本的分段器
当前选择: option1
vue
<template>
<MtSegmented
v-model="selectedValue"
:options="options"
/>
</template>
<script setup>
import { ref } from 'vue'
import { MtSegmented } from 'vitepress-theme-mist'
const selectedValue = ref('option1')
const options = [
{ value: 'option1', label: '选项一' },
{ value: 'option2', label: '选项二' },
{ value: 'option3', label: '选项三' }
]
</script>
禁用状态
整个分段器或单个选项可以被禁用。
使用 disabled 属性禁用整个分段器
当前选择: option1
vue
<template>
<!-- 禁用整个分段器 -->
<MtSegmented
v-model="disabledValue"
:options="options"
disabled
/>
</template>
<script setup>
import { ref } from 'vue'
import { MtSegmented } from 'vitepress-theme-mist'
const disabledValue = ref('option1')
const options = [
{ value: 'option1', label: '选项一' },
{ value: 'option2', label: '选项二' },
{ value: 'option3', label: '选项三' }
]
</script>
带图标
选项可以显示图标,增强视觉效果。
在选项配置中添加 icon 属性来显示图标
当前选择: ep:coordinate
vue
<template>
<MtSegmented
v-model="selectedIcon"
:options="iconOptions"
/>
</template>
<script setup>
import { ref } from 'vue'
import { MtSegmented } from 'vitepress-theme-mist'
const selectedIcon = ref("ep:coordinate")
const iconOptions = [
{ value: "ep:coordinate", icon: "ep:coordinate" },
{ value: "ep:copy", icon: "ep:copy-document" },
{ value: "ep:cpu", icon: "ep:cpu" },
{ value: "ep:credit-card", icon: "ep:credit-card" },
{ value: "ep:crop", icon: "ep:crop" },
{ value: "ep:d-arrow-left", icon: "ep:d-arrow-left" },
{ value: "ep:d-arrow-right", icon: "ep:d-arrow-right" },
]
</script>
混合模式
部分选项带图标,部分不带,实现灵活的显示效果。
为部分选项添加图标,其他选项只显示文本
当前选择: option1
vue
<template>
<MtSegmented
v-model="mixedValue"
:options="mixedOptions"
/>
</template>
<script setup>
import { ref } from 'vue'
import { MtSegmented } from 'vitepress-theme-mist'
const mixedValue = ref('option1')
const mixedOptions = [
{ value: 'option1', label: '选项一' },
{ value: 'option2', label: '选项二', icon: "ep:coordinate" },
{ value: 'option3', label: '选项三' },
{ value: 'option4', label: '选项四', icon: "ep:cpu" }
]
</script>
数值类型
支持数值类型的选项值,适用于需要数值选择的场景。
选项值可以是数字类型,不仅限于字符串
当前选择: 1
vue
<template>
<MtSegmented
v-model="numberValue"
:options="numberOptions"
/>
</template>
<script setup>
import { ref } from 'vue'
import { MtSegmented } from 'vitepress-theme-mist'
const numberValue = ref(1)
const numberOptions = [
{ value: 1, label: '一月' },
{ value: 2, label: '二月' },
{ value: 3, label: '三月' },
{ value: 4, label: '四月' }
]
</script>
API
组件属性
MtSegmented Props
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
options | 选项数组 | SegmentedOption[] | [] |
disabled | 是否禁用整个分段器 | boolean | false |
MtSegmentedItem Props
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
value | 选项的值 | ModelType | - |
label | 选项的标签文本 | string | - |
icon | 选项的图标 | MtIconProps["icon"] | - |
title | 鼠标悬停时的提示文本 | string | - |
name | 选项的名称(用于表单) | string | - |
ariaLabel | 无障碍标签 | string | - |
类型定义
ModelType
typescript
export type ModelType = string | number | object | boolean
SegmentedOption
typescript
export interface SegmentedOption extends SegmentedBase {
ariaLabel?: string;
}
export interface SegmentedBase {
value: ModelType;
label?: string;
icon?: MtIconProps["icon"];
title?: string;
name?: string;
}
事件
v-model
v-model
: 绑定当前选中的值,类型为ModelType
其他数据类型示例
对象类型
组件支持对象类型的选项值。
vue
<template>
<MtSegmented
v-model="objectValue"
:options="objectOptions"
/>
</template>
<script setup>
import { ref } from 'vue'
import { MtSegmented } from 'vitepress-theme-mist'
const objectValue = ref({ id: 1 })
const objectOptions = [
{ value: { id: 1 }, label: '对象一' },
{ value: { id: 2 }, label: '对象二' },
{ value: { id: 3 }, label: '对象三' }
]
</script>
自定义属性
可以为选项添加更多自定义属性来增强功能。
vue
<template>
<MtSegmented
v-model="customValue"
:options="customOptions"
/>
</template>
<script setup>
import { ref } from 'vue'
import { MtSegmented } from 'vitepress-theme-mist'
const customValue = ref('option1')
const customOptions = [
{
value: 'option1',
label: '选项一',
title: '这是选项一的详细说明',
name: 'segmented-option-1',
ariaLabel: '选择第一个选项'
},
{
value: 'option2',
label: '选项二',
title: '这是选项二的详细说明',
name: 'segmented-option-2',
ariaLabel: '选择第二个选项'
},
{
value: 'option3',
label: '选项三',
title: '这是选项三的详细说明',
name: 'segmented-option-3',
ariaLabel: '选择第三个选项'
}
]
</script>
注意事项
无障碍支持: 组件内置了基本的 ARIA 属性支持,包括
aria-checked
和role="radio"
,确保屏幕阅读器能够正确识别组件状态。数据类型: 组件支持多种数据类型(字符串、数值、对象、布尔值),但在使用对象类型时,需要确保对象的引用一致性。
图标显示: 图标是可选的,可以根据需要为部分或全部选项添加图标。
禁用状态: 只支持整个分段器禁用,通过设置
disabled
属性来控制。样式定制: 组件使用 CSS 类名进行样式控制,可以通过覆盖相应的 CSS 类来自定义外观。
表单集成: 组件基于
fieldset
和input[type="radio"]
实现,可以很好地与表单集成使用。响应式: 组件完全支持 Vue 3 的响应式系统,可以与
ref
、reactive
等响应式 API 无缝配合使用。