返回目录
组件详情入口
数据展示
@vean/ui
SAccordion

Accordion

Accordion 属于 数据展示 分类。建议先看演示与用法,再对照 API 表格完成接入和样式调整。

先用快捷跳转面板找到概述、用法、演示和 API,再往下细读完整文档内容。

快速跳转

同分类组件

如果你在同一类交互里做组合,这些组件通常会一起出现。

手风琴

概述

一组垂直(或水平)堆叠的交互式标题,每个标题可展开一块内容,支持单选或多选展开。SAccordion 组合 AccordionRoot/AccordionItem/AccordionHeader/AccordionTrigger/AccordionContent/AccordionDescription 这一系列 Aria 基础组件(零样式)与 accordionVariants 样式配方(8 个槽、6 种尺寸)。

适用于 FAQ、设置分组、可折叠导航,或任何「展开显示」的模式(一次打开一个或多个区块)。当一次只需显示一个面板且每个面板有持久标签时请优先使用 tabs;单个独立折叠区块请优先使用 collapsible。

SAccordion 通过 AccordionCompact 聚合这些基础组件,并以 items 数据驱动,提供 item/leading/title/trigger-icon/content 插槽。需要完全自定义组合时,可直接使用 Aria 层的 AccordionRoot 系列基础组件。

用法

特性

  • 🧩 Aria/样式分离 — AccordionCompact 聚合 6 个基础组件并以 items 驱动;SAccordion 只注入样式并转发插槽/事件
  • 🎚️ 单选 / 多选 — multiple 切换单开/多开(M extends boolean 泛型);collapsible 允许全部关闭
  • ⌨️ 键盘导航 — 方向键在触发器间移动(useArrowNavigation),遵循 orientation 与 dir;触发器暴露 aria-expanded/aria-disabled/data-state
  • 🧭 方向 — vertical(默认)或 horizontal
  • ⛔ 禁用条目 — 逐条 disabled 与根 disabled 传播
  • 🎨 6 种尺寸 — 匹配 ThemeSize 的 xs–2xl size
  • 🔧 完全可定制 — 触发器支持 as/asChild,leading/title/trigger-icon/content/item 插槽,以及逐槽 ui 覆盖
  • ♿ 无障碍友好 — 真实 <button> 触发器带 aria-expanded,经 data-state 实现折叠动画,axe-core 零违规

组件家族

  • SAccordion(样式层)— 入口包装组件;accordionVariants 配方配合动态插槽转发
  • AccordionRoot(Aria)— 状态所有者;useSelection 管理单选/多选 modelValue,暴露 dir/orientation
  • AccordionItem(Aria)— 单个区块;从根派生 open/disabled 状态并接入方向键导航
  • AccordionHeader(Aria)— 承载触发器的头部容器
  • AccordionTrigger(Aria)— <button> 触发器;aria-expanded/aria-disabled/data-state 与点击切换
  • AccordionContent(Aria)— 带动画的折叠内容(CollapsibleContent)
  • AccordionDescription(Aria)— 内容中的默认描述文本
  • AccordionCompact(Aria)— 聚合组件;将 items 迭代为条目并暴露自定义插槽

演示

基础

自定义图标

自定义样式

API

Aria 层

8

Accordion<T, M>

18 属性1 事件5 插槽
属性
属性名类型默认值描述
class
ClassValue
—
根类
size
ThemeSize
—
组件的视觉尺寸。
ui
Partial<AccordionUi>
—
该组件的按槽类重写。
items
T[]
—
由该组件渲染的项。
itemProps
AccordionItemProps
—
转发给 item 元素的属性。
headerProps
AccordionHeaderProps
—
转发至 header 元素的属性。
triggerProps
AccordionTriggerProps
—
转发给触发元素的属性。
contentProps
AccordionContentProps
—
转发给内容元素的属性。
descriptionProps
AccordionDescriptionProps
—
已将属性转发至 description 元素。
collapsible
boolean
false
当 type 为 "single" 时,允许通过点击打开项的触发器来折叠内容。 当 type 为 "multiple" 时,此属性无效。
dir
Direction
'ltr'
如适用,请指定折叠面板的阅读方向。若未指定,则默认采用 LTR(从左到右)阅读模式。
disabled
boolean
false
当值为 `true` 时,禁止用户与折叠面板及其所有项目进行交互
orientation
DataOrientation
'vertical'
折叠面板的显示方向。
unmountOnHide
boolean
`true`
当值为 `true` 时,该元素将在关闭状态下被卸载。
modelValue
(M extends true ? string[] : string)
—
所选项的受控值。 当需要控制项的状态时使用此属性。可通过 `v-model` 进行绑定。
defaultValue
(M extends true ? string[] : string)
—
所选项的默认值。 当需要设置项的初始状态时,请使用此选项。
multiple
M
—
用于确定一次可选择“单个”还是“多个”项目。 此属性将覆盖根据 `modelValue` 和 `defaultValue` 推断出的类型。
selectionBehavior
SelectionBehavior
'toggle'
集合中多选功能应如何工作。
事件
事件名参数描述
update:modelValue
M extends true ? string[] : string
—
插槽
插槽名参数描述
item
AccordionCompactSlotProps<T, M>
项插槽的自定义内容。
leading
AccordionCompactSlotProps<T, M>
为首行位置提供自定义内容。
title
AccordionCompactSlotProps<T, M>
标题槽位的自定义内容。
trigger-icon
AccordionCompactSlotProps<T, M>
触发图标槽位的自定义内容。
content
AccordionCompactSlotProps<T, M>
内容插槽的自定义内容。

AccordionCompact<T, M>

15 属性1 事件5 插槽
属性
属性名类型默认值描述
items
T[]
—
由该组件渲染的项。
itemProps
AccordionItemProps
—
转发给 item 元素的属性。
headerProps
AccordionHeaderProps
—
转发至 header 元素的属性。
triggerProps
AccordionTriggerProps
—
转发给触发元素的属性。
contentProps
AccordionContentProps
—
转发给内容元素的属性。
descriptionProps
AccordionDescriptionProps
—
已将属性转发至 description 元素。
collapsible
boolean
false
当 type 为 "single" 时,允许通过点击打开项的触发器来折叠内容。 当 type 为 "multiple" 时,此属性无效。
dir
Direction
'ltr'
如适用,请指定折叠面板的阅读方向。若未指定,则默认采用 LTR(从左到右)阅读模式。
disabled
boolean
false
当值为 `true` 时,禁止用户与折叠面板及其所有项目进行交互
orientation
DataOrientation
'vertical'
折叠面板的显示方向。
unmountOnHide
boolean
`true`
当值为 `true` 时,该元素将在关闭状态下被卸载。
modelValue
(M extends true ? string[] : string)
—
所选项的受控值。 当需要控制项的状态时使用此属性。可通过 `v-model` 进行绑定。
defaultValue
(M extends true ? string[] : string)
—
所选项的默认值。 当需要设置项的初始状态时,请使用此选项。
multiple
M
—
用于确定一次可选择“单个”还是“多个”项目。 此属性将覆盖根据 `modelValue` 和 `defaultValue` 推断出的类型。
selectionBehavior
SelectionBehavior
'toggle'
集合中多选功能应如何工作。
事件
事件名参数描述
update:modelValue
M extends true ? string[] : string
—
插槽
插槽名参数描述
item
AccordionCompactSlotProps<T, M>
项插槽的自定义内容。
leading
AccordionCompactSlotProps<T, M>
为首行位置提供自定义内容。
title
AccordionCompactSlotProps<T, M>
标题槽位的自定义内容。
trigger-icon
AccordionCompactSlotProps<T, M>
触发图标槽位的自定义内容。
content
AccordionCompactSlotProps<T, M>
内容插槽的自定义内容。

AccordionContent

3 属性
属性
属性名类型默认值描述
forceMount
boolean
—
用于在需要更多控制时强制挂载。 在使用 Vue 动画库控制动画时非常有用。
asChild
boolean
—
将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。
as
AsTag | Component
'div'
该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。

AccordionDescription

AccordionHeader

AccordionItem

5 属性
属性
属性名类型默认值描述
value
string
—
折叠面板项的值。折叠面板内的所有项应使用唯一的值。
disabled
boolean
—
当值为 `true` 时,禁止用户与可折叠区域进行交互。
unmountOnHide
boolean
—
当值为 `true` 时,该元素将在关闭状态下被卸载。
asChild
boolean
—
将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。
as
AsTag | Component
'div'
该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。

AccordionRoot<M>

9 属性1 事件
属性
属性名类型默认值描述
collapsible
boolean
false
当 type 为 "single" 时,允许通过点击打开项的触发器来折叠内容。 当 type 为 "multiple" 时,此属性无效。
dir
Direction
'ltr'
如适用,请指定折叠面板的阅读方向。若未指定,则默认采用 LTR(从左到右)阅读模式。
disabled
boolean
false
当值为 `true` 时,禁止用户与折叠面板及其所有项目进行交互
orientation
DataOrientation
'vertical'
折叠面板的显示方向。
unmountOnHide
boolean
`true`
当值为 `true` 时,该元素将在关闭状态下被卸载。
modelValue
(M extends true ? string[] : string)
—
所选项的受控值。 当需要控制项的状态时使用此属性。可通过 `v-model` 进行绑定。
defaultValue
(M extends true ? string[] : string)
—
所选项的默认值。 当需要设置项的初始状态时,请使用此选项。
multiple
M
—
用于确定一次可选择“单个”还是“多个”项目。 此属性将覆盖根据 `modelValue` 和 `defaultValue` 推断出的类型。
selectionBehavior
SelectionBehavior
'toggle'
集合中多选功能应如何工作。
事件
事件名参数描述
update:modelValue
M extends true ? string[] : string
—

AccordionTrigger

5 属性
属性
属性名类型默认值描述
disabledCollapsible
boolean
—
当值为 `true` 时,禁止用户切换折叠功能。
type
ButtonType
'button'
按钮元素的类型。可以是 'button'、'submit' 或 'reset' 之一。
disabled
boolean
—
该组件是否已禁用。
asChild
boolean
—
将默认渲染元素替换为作为子元素传递的元素,并合并两者的属性及行为。
as
AsTag | Component
'div'
该组件应渲染为的元素或组件。可通过 `asChild` 进行覆盖。

注意事项

架构与对标差异

AccordionCompact 负责 items 迭代与默认内容装配,所有基础组件保持零样式,仅由 UI 包装组件注入 accordionVariants 类。这与 shadcn/ui 的 headless 分离及 Radix 的 Accordion 原语一致;而 Ant Design、Element Plus、Mantine、Naive UI 则提供 defaultActiveKey/activeKey 配置驱动的折叠。VeanUI 的根使用 useSelection,使单选/多选共享同一状态模型,方向键导航复用菜单家族一致的 useArrowNavigation 组合式函数。

能力VeanUIshadcn/uiAnt Design CollapseElement Plus CollapseMantine AccordionNaive UI Collapse
Aria/样式分离✅✅————
单选 / 多选✅✅✅✅✅✅
可全部关闭✅✅✅✅✅✅
方向键导航✅✅✅✅✅✅
自定义触发器图标✅—✅✅✅✅
数据驱动 items(Compact)✅—✅✅✅✅
禁用条目✅✅✅✅✅✅
方向(v/h)✅—✅✅——
as/asChild 触发器✅✅————

— = 不支持或采用不同交互模型。

运行时注意

  • 单选模式(multiple: false)下仅保持一个区块展开;collapsible(默认 true)时点击已展开的触发器会关闭它,使所有区块都关闭。
  • 方向键导航要求某个触发器已聚焦;按键遵循 orientation(纵向 ArrowUp/ArrowDown,横向 ArrowLeft/ArrowRight),并在 RTL 下经 dir 交换。
  • unmountOnHide(默认 true)卸载已关闭的内容;设为 false 可使其保留在 DOM 中(例如保留内部表单状态)。
  • 默认触发器 chevron 依据 data-state 由 CSS 旋转;需要不同指示符时通过 trigger-icon 插槽替换。
  • 禁用条目忽略点击、被方向键导航跳过,但仍在 DOM 顺序中可被辅助技术触达。

Roadmap

核心手风琴 API 无阻塞缺口。边框 variant 变体与 left 图标触发器布局为已评估增强项,记录在 docs/roadmap/README.md。

FAQ

如何只允许一次展开一个区块?

单选为默认——将 modelValue 绑定为单个值:

<SAccordion v-model="open" :items="items" />

如何允许多个区块同时展开?

设置 multiple 并绑定数组:

<SAccordion v-model="openList" multiple :items="items" />

如何允许所有区块关闭?

collapsible 默认 true,点击已展开的触发器即关闭:

<SAccordion collapsible :items="items" />

如何自定义触发器图标?

使用 trigger-icon 插槽(左侧图标用 leading):

<SAccordion :items="items">
  <template #trigger-icon="{ open }">
    <SIcon :icon="open ? 'lucide:minus' : 'lucide:plus'" />
  </template>
</SAccordion>

如何构建完全自定义的条目?

使用 item 插槽自行组合 Aria 部件:

<SAccordion :items="items">
  <template #item="{ item, open }">
    <div class="border-b">
      <button type="button" :aria-expanded="open">{{ item.title }}</button>
      <div v-if="open">{{ item.description }}</div>
    </div>
  </template>
</SAccordion>

更新日志

版本记录按发布版本分组,便于快速查看这个组件在不同版本里的实际变更。

v0.22.0

2026-05-13

对比版本

优化

默认启用可折叠行为并更新相关道具

范围: accordion作者: soybeanjs查看提交bec18

v0.15.0

2026-04-26

对比版本

新功能

实施 AccordionCompact 组件并更新相关类型和上下文

范围: accordion作者: soybeanjs查看提交e05b3

新功能

添加 AccordionDescription 组件并更新相关文件

范围: accordion作者: soybeanfe查看提交6506e

优化

优化插槽模板类型

范围: accordion作者: soybeanjs查看提交db7a1

优化

为 Accordion 组件重组导入并更新插槽结构

范围: accordion作者: soybean-js查看提交22707

新功能

添加 AccordionDescription 组件并更新相关文件

范围: accordion作者: soybeanfe查看提交6506e

优化

为 Accordion 组件重组导入并更新插槽结构

范围: accordion作者: soybean-js查看提交22707

新功能

实施 AccordionCompact 组件并更新相关类型和上下文

范围: accordion作者: soybeanjs查看提交e05b3

优化

优化插槽模板类型

范围: accordion作者: soybeanjs查看提交db7a1

v0.8.0

2026-02-10

对比版本

修复

为 unmountOnHide 添加默认值

范围: accordion作者: soybeanjs查看提交1f86b

v0.0.2

2025-11-18

对比版本

新功能

实现折叠组件结构,包含根节点、项目、标题、内容、触发器及上下文管理

范围: accordion作者: soybeanjs查看提交183c5

新功能

为折叠组件添加主题上下文,以实现样式自定义

范围: accordion作者: soybeanjs查看提交e7600

新功能

实现一个具备属性管理、可自定义插槽以及主题上下文集成功能的 Accordion 组件

范围: accordion作者: soybeanjs查看提交a0fcd

新功能

添加多个带有自定义图标和样式选项的折叠面板示例,并整合卡片组件示例

范围: accordion作者: soybeanjs查看提交c6128

新功能

实现了具有可自定义插槽和属性的 Accordion 组件,增强了 Accordion 的功能和主题支持

范围: accordion作者: soybeanjs查看提交be778

修复

通过将描述包裹在段落中来增强内容插槽,并更新折叠面板变体的样式以优化间距

范围: accordion作者: soybeanjs查看提交7a4cc

修复

调整所有尺寸变体中触发元素的内边距和间距值,以提高布局的一致性

范围: accordion作者: soybeanjs查看提交db0e7

优化

使用 `useSelection` 优化折叠面板

范围: accordion作者: soybeanjs查看提交220ac

重构

为提高清晰度,请重命名根元素的引用;为确保唯一性,请更新触发器 ID 的前缀

范围: accordion作者: soybeanjs查看提交19086

重构

将直接使用集合项属性的方式替换为辅助函数,以改进 keydown 事件的处理

范围: accordion作者: soybeanjs查看提交5e894

重构

更新折叠面板的上下文,为 rootElement 使用 shallowRef,并改进方向处理机制

范围: accordion作者: soybeanjs查看提交273cc

重构

通过移除不必要的类型参数并改进单个/多个处理的清晰度,简化折叠组件的属性

范围: accordion作者: soybeanjs查看提交5d201

重构

将 `toggleModelValue` 重命名为 `onModelValueChange`,以提高值处理的清晰度

范围: accordion作者: soybeanjs查看提交f3161

重构

将“direction”重命名为“dir”,以确保上下文处理的一致性

范围: accordion作者: soybeanjs查看提交99efc

重构

将类型 AccordionItemData 重命名为 AccordionOptionData

范围: accordion作者: soybeanjs查看提交13ef9

新功能

实现折叠组件结构,包含根节点、项目、标题、内容、触发器及上下文管理

范围: accordion作者: soybeanjs查看提交183c5

新功能

为折叠组件添加主题上下文,以实现样式自定义

范围: accordion作者: soybeanjs查看提交e7600

新功能

实现一个具备属性管理、可自定义插槽以及主题上下文集成功能的 Accordion 组件

范围: accordion作者: soybeanjs查看提交a0fcd

新功能

添加多个带有自定义图标和样式选项的折叠面板示例,并整合卡片组件示例

范围: accordion作者: soybeanjs查看提交c6128

新功能

实现了具有可自定义插槽和属性的 Accordion 组件,增强了 Accordion 的功能和主题支持

范围: accordion作者: soybeanjs查看提交be778

修复

通过将描述包裹在段落中来增强内容插槽,并更新折叠面板变体的样式以优化间距

范围: accordion作者: soybeanjs查看提交7a4cc

修复

调整所有尺寸变体中触发元素的内边距和间距值,以提高布局的一致性

范围: accordion作者: soybeanjs查看提交db0e7

优化

使用 `useSelection` 优化折叠面板

范围: accordion作者: soybeanjs查看提交220ac

重构

为提高清晰度,请重命名根元素的引用;为确保唯一性,请更新触发器 ID 的前缀

范围: accordion作者: soybeanjs查看提交19086

重构

将直接使用集合项属性的方式替换为辅助函数,以改进 keydown 事件的处理

范围: accordion作者: soybeanjs查看提交5e894

重构

更新折叠面板的上下文,为 rootElement 使用 shallowRef,并改进方向处理机制

范围: accordion作者: soybeanjs查看提交273cc

重构

通过移除不必要的类型参数并改进单个/多个处理的清晰度,简化折叠组件的属性

范围: accordion作者: soybeanjs查看提交5d201

重构

将 `toggleModelValue` 重命名为 `onModelValueChange`,以提高值处理的清晰度

范围: accordion作者: soybeanjs查看提交f3161

重构

将“direction”重命名为“dir”,以确保上下文处理的一致性

范围: accordion作者: soybeanjs查看提交99efc

重构

将类型 AccordionItemData 重命名为 AccordionOptionData

范围: accordion作者: soybeanjs查看提交13ef9