Skip to content

LV025-Segmented分段器

简介

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是否禁用整个分段器booleanfalse

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>

注意事项

  1. 无障碍支持: 组件内置了基本的 ARIA 属性支持,包括 aria-checkedrole="radio",确保屏幕阅读器能够正确识别组件状态。

  2. 数据类型: 组件支持多种数据类型(字符串、数值、对象、布尔值),但在使用对象类型时,需要确保对象的引用一致性。

  3. 图标显示: 图标是可选的,可以根据需要为部分或全部选项添加图标。

  4. 禁用状态: 只支持整个分段器禁用,通过设置 disabled 属性来控制。

  5. 样式定制: 组件使用 CSS 类名进行样式控制,可以通过覆盖相应的 CSS 类来自定义外观。

  6. 表单集成: 组件基于 fieldsetinput[type="radio"] 实现,可以很好地与表单集成使用。

  7. 响应式: 组件完全支持 Vue 3 的响应式系统,可以与 refreactive 等响应式 API 无缝配合使用。