Skip to content

Accordion 手风琴/折叠面板

手风琴组件用于在垂直堆叠的面板之间切换,支持手风琴模式(单展开)与多展开模式,并提供多种视觉变体。

基础用法(手风琴模式)

通过 accordion 属性启用互斥模式,一次只能展开一个面板。v-model 绑定为字符串类型。

vue
<TAccordion v-model="activeName" accordion>
  <TAccordionItem name="item-1" title="面板标题一">
    面板内容一
  </TAccordionItem>
  <TAccordionItem name="item-2" title="面板标题二">
    面板内容二
  </TAccordionItem>
</TAccordion>

多展开模式

不设置 accordion 属性时,多个面板可同时展开。v-model 绑定为字符串数组。

vue
<TAccordion v-model="activeNames">
  <TAccordionItem name="item-1" title="面板一">
    内容一
  </TAccordionItem>
  <TAccordionItem name="item-2" title="面板二">
    内容二
  </TAccordionItem>
</TAccordion>

默认全部折叠

v-model 为空字符串(手风琴模式)或空数组(多展开模式)时,所有面板默认折叠。

vue
<TAccordion v-model="empty" accordion>
  <TAccordionItem name="item-1" title="面板一">...</TAccordionItem>
  <TAccordionItem name="item-2" title="面板二">...</TAccordionItem>
</TAccordion>

视觉变体

Flush 变体

通过 variant="flush" 去除外边框与圆角,仅保留项间分隔线。

vue
<TAccordion variant="flush" accordion>
  <TAccordionItem name="item-1" title="面板一">...</TAccordionItem>
  <TAccordionItem name="item-2" title="面板二">...</TAccordionItem>
</TAccordion>

Tabs 变体

通过 variant="tabs" 使用顶部强调分隔线的选项卡风格。

vue
<TAccordion variant="tabs" accordion>
  <TAccordionItem name="item-1" title="面板一">...</TAccordionItem>
  <TAccordionItem name="item-2" title="面板二">...</TAccordionItem>
</TAccordion>

Inverted 反转变体

通过 inverted 使用深色标题栏 + 浅色内容区的反转样式。

vue
<TAccordion accordion inverted>
  <TAccordionItem name="item-1" title="面板一">...</TAccordionItem>
  <TAccordionItem name="item-2" title="面板二">...</TAccordionItem>
</TAccordion>

禁用面板

TAccordionItem 上设置 disabled 禁用点击展开。

vue
<TAccordion accordion>
  <TAccordionItem name="item-1" title="可点击的面板">...</TAccordionItem>
  <TAccordionItem name="item-2" title="禁用的面板" disabled>...</TAccordionItem>
  <TAccordionItem name="item-3" title="另一个面板">...</TAccordionItem>
</TAccordion>

自定义标题插槽

使用 #title 插槽自定义标题区,提供 isActive 作用域参数。

vue
<TAccordion accordion>
  <TAccordionItem name="item-1">
    <template #title="{ isActive }">
      <span>{{ isActive ? '展开' : '收起' }}</span>
    </template>
    面板内容
  </TAccordionItem>
</TAccordion>

带图标

通过 icon prop 在标题前显示图标。

vue
<TAccordion accordion>
  <TAccordionItem name="item-1" title="链接面板" :icon="IconLink">
    面板内容
  </TAccordionItem>
</TAccordion>

beforeChange 拦截

通过 beforeChange 拦截面板切换,可用于未保存提示等场景。

vue
<TAccordion accordion :before-change="(name, expanded) => name !== 'item-2'">
  <TAccordionItem name="item-1" title="允许展开">...</TAccordionItem>
  <TAccordionItem name="item-2" title="被拦截">...</TAccordionItem>
</TAccordion>

隐藏箭头

通过 hide-arrow 隐藏展开箭头,提供更简洁的视觉效果。

vue
<TAccordion accordion hide-arrow>
  <TAccordionItem name="item-1" title="面板一">...</TAccordionItem>
</TAccordion>

Plus 图标模式

通过 plus-icon 使用 +/- 图标代替 chevron 旋转图标,适合"常见问题"等场景。

vue
<TAccordion accordion plus-icon>
  <TAccordionItem name="item-1" title="问题一">回答一</TAccordionItem>
  <TAccordionItem name="item-2" title="问题二">回答二</TAccordionItem>
</TAccordion>

API

TAccordion Props

Prop说明类型默认值
modelValue当前展开的面板(v-model)string | string[]'' / []
accordion手风琴模式(单展开互斥)booleanfalse
variant视觉变体'default' | 'flush' | 'tabs''default'
inverted反转样式(深色标题栏)booleanfalse
plusIcon使用 +/- 图标booleanfalse
expandIconPosition展开图标位置'left' | 'right''right'
hideArrow隐藏所有面板展开箭头booleanfalse
beforeChange切换前置拦截钩子(name: string, expanded: boolean) => boolean | Promise<boolean>

TAccordion Emits

事件参数说明
update:modelValue(value: string | string[])v-model 更新事件
change(name: string, expanded: boolean)面板展开/收起变化时触发

TAccordion Slots

插槽说明
defaultTAccordionItem 子组件

TAccordionItem Props

Prop说明类型默认值
name唯一标识string—(必填)
title标题文字string''
icon标题前图标(@tabler/icons-vue 导入)Icon
disabled禁用切换booleanfalse
hideArrow隐藏当前面板展开箭头booleanfalse

TAccordionItem Slots

插槽作用域参数说明
default面板内容区
title{ isActive: boolean, toggle: () => void }自定义标题区
icon{ isActive: boolean }自定义展开图标