手风琴

手风琴显示一个高级选项列表,可以展开/折叠以显示更多信息。


安装

npx nextui-cli@latest add accordion
上述命令仅用于单独安装。如果已全局安装 @nextui-org/react,则可以跳过此步骤。

导入

NextUI 导出了 2 个手风琴相关组件

  • 手风琴:用于显示手风琴项目列表的主组件。
  • 手风琴项目:用于显示单个手风琴项目的项目组件。

用法

带副标题

展开多个项目

如果你将 selectionMode 设置为 multiple,那么 手风琴 将允许同时展开多个项目。

紧凑

如果您将 isCompact 设置为 trueAccordion 将以紧凑的样式显示。

变体

Accordion 有 4 种变体:lightshadowborderedsplitted

Light 变体

Shadow 变体

Bordered 变体

拆分变体

默认展开键

如果你想默认展开某些项,你可以将 defaultExpandedKeys 属性设置为一个键数组。

禁用键

如果你想禁用某些项,你可以将 disabledKeys 属性设置为一个键数组。

开始内容

如果你想在手风琴项之前显示一些内容,你可以设置 startContent 属性。

自定义指示器

手风琴项目有一个名为 indicator 的属性。您可以使用它来自定义打开/关闭指示器。

指示器也可以是 function,它接收 isOpenisDisabled 和默认 indicator 作为参数。

自定义动画

手风琴提供 motionProps 属性来自定义 enter / exit 动画。

在此处了解有关 Framer 运动变体的更多信息

受控

手风琴是一个受控组件,这意味着您需要自己控制selectedKeys 属性。

手风琴项目插槽

  • base:手风琴项目包装器。
  • heading:手风琴项目标题。它包含indicatortitle
  • 触发器:打开/关闭手风琴项的按钮。
  • 标题包装器标题副标题 的包装器。
  • 标题:手风琴项标题。
  • 副标题:手风琴项副标题。
  • 开始内容:手风琴项之前的内容。
  • 指示器:指示手风琴项打开/关闭状态的元素。
  • 内容:手风琴项内容。

自定义手风琴样式

你可以使用以下任何属性来自定义手风琴和手风琴项样式

  • className:手风琴的类名。修改手风琴包装器样式。(手风琴)
  • itemClasses:手风琴项的类名。一次修改所有手风琴项样式。(手风琴)
  • classNames:手风琴项的类名。分别修改每个手风琴项样式。(手风琴项)

以下是如何自定义手风琴样式的示例

数据属性

AccordionItembase 元素上具有以下属性

  • data-open: 手风琴项是否打开。
  • data-disabled: 手风琴项被禁用时。
  • data-hover: 当手风琴项被悬停时。基于 useHover
  • data-focus: 当手风琴项被聚焦时。基于 useFocusRing
  • data-focus-visible:当手风琴项通过键盘获得焦点时。基于 useFocusRing
  • data-disabled:当手风琴项被禁用时。基于 isDisabled 属性。
  • data-pressed:当手风琴项被按下时。基于 usePress

无障碍

  • 键盘事件支持 空格回车向上箭头向下箭头 以及 主页 / 结束 键。
  • 键盘焦点管理和跨浏览器规范化。
  • aria-expanded 手风琴项目的属性。
  • aria-disabled 手风琴项目的属性。
  • aria-controls 手风琴项目的属性。

API

手风琴属性

属性类型说明默认值
childrenReactNode | ReactNode[]集合的内容。通常是 AccordionItem 数组
variantlight | shadow | bordered | splitted手风琴外观样式。light
selectionModenone | single | multiple集合中允许的选择类型。
selectionBehaviortoggle | replace手风琴选择行为。toggle
isCompactboolean是否所有手风琴项都应该更小。false
isDisabledboolean手风琴项是否已禁用。
showDividerboolean是否在每个手风琴项底部显示分隔线。true
分隔符属性DividerProps分隔符组件属性。-
hideIndicatorboolean是否隐藏手风琴项指示器。
disableAnimationboolean是否禁用手风琴项打开/关闭动画。
disableIndicatorAnimationboolean是否禁用手风琴项指示器动画。
disallowEmptySelectionboolean集合是否允许空选择。
keepContentMountedboolean手风琴项内容是否应始终挂载。false
fullWidthboolean手风琴是否应占据其父容器的全部宽度。true
motionPropsMotionProps手风琴的运动属性。
disabledKeysReact.Key[]已禁用的项键。这些项无法选择、聚焦或与之交互。
itemClasses类名手风琴项类名。
selectedKeysall | React.Key[]集合中当前选定的键(受控)。
defaultSelectedKeysall | React.Key[]集合中最初选定的键(不受控)。
disabledKeysReact.Key[]集合中当前禁用的键(受控)。

手风琴事件

属性类型说明
onSelectionChange(keys: "all" | Set<React.Key>) => any在选择发生更改时调用的处理程序。

手风琴项属性

属性类型说明默认值
childrenReactNode | string组件的内容。
titleReactNode | string手风琴项标题。
副标题ReactNode | string手风琴项目副标题。
指示器IndicatorProps手风琴项目 expanded 指示器,通常为箭头图标。
startContentReactNode手风琴项目开始内容,通常为图标或头像。
motionPropsMotionProps用于修改 framer 运动动画的属性。使用 variants API 创建自己的动画。
isCompactbooleanAccordionItem 是否紧凑。false
isDisabledboolean当前禁用状态。false
keepContentMountedboolean关闭时是否保持 AccordionItem 内容已安装。false
hideIndicatorbooleanAccordionItem 指示器是否隐藏。false
disableAnimationbooleanAccordionItem 动画是否已禁用。false
disableIndicatorAnimationbooleanAccordionItem 指示器动画是否已禁用。false
HeadingComponentReact.ElementType可自定义标题标记,用于 Web 辅助功能。使用标题描述内容,并始终如一且语义化地使用它们。h2
classNames类名允许为手风琴项目槽设置自定义类名。-

手风琴项目事件

属性类型说明
onFocus(e: FocusEvent) => void当元素获得焦点时调用的处理程序。
onBlur(e: FocusEvent) => void当元素失去焦点时调用的处理程序。
onFocusChange(isFocused: boolean) => void当元素的焦点状态更改时调用的处理程序。
onKeyDown(e: KeyboardEvent) => void当按下某个键时调用的处理程序。
onKeyUp(e: KeyboardEvent) => void当释放某个键时调用的处理程序。
onPress(e: PressEvent) => void在目标上释放按压时调用的处理程序。
onPressStart(e: PressEvent) => void当按压交互开始时调用的处理程序。
onPressEnd(e: PressEvent) => void当按下交互结束时调用的处理程序,无论是在目标上还是当指针离开目标时。
onPressChange(isPressed: boolean) => void按下状态更改时调用的处理程序。
onPressUp(e: PressEvent) => void当在目标上释放按下时调用的处理程序,无论它是否从目标开始。
onClickMouseEventHandler本机按钮单击事件处理程序 (已弃用) 使用 onPress 代替。

类型

手风琴项目指示器属性

export type AccordionItemIndicatorProps = {
/**
* The current indicator, usually an arrow icon.
*/
indicator?: ReactNode;
/**
* The current open status.
*/
isOpen?: boolean;
/**
* The current disabled status.
* @default false
*/
isDisabled?: boolean;
};
type indicator?: ReactNode | ((props: AccordionItemIndicatorProps) => ReactNode) | null;

手风琴项目类名

export type AccordionItemClassnames = {
base?: string;
heading?: string;
trigger?: string;
titleWrapper?: string;
title?: string;
subtitle?: string;
startContent?: string;
indicator?: string;
content?: string;
};

运动属性

export type MotionProps = {
/**
* If `true`, the opacity of the content will be animated
* @default true
*/
animateOpacity?: boolean;
/**
* The height you want the content in its collapsed state.
* @default 0
*/
startingHeight?: number;
/**
* The height you want the content in its expanded state.
* @default "auto"
*/
endingHeight?: number | string;
/**
* The y-axis offset you want the content in its collapsed state.
* @default 10
*/
startingY?: number;
/**
* The y-axis offset you want the content in its expanded state.
* @default 0
*/
endingY?: number;
} & HTMLMotionProps;