按钮
按钮允许用户通过单击进行操作和选择。
简介
Button 组件替换了原生的 HTML <button> 元素,并为样式和可访问性提供了扩展选项。
组件
import { Button } from '@mui/base/Button';
Button 的行为类似于原生的 HTML <button>,因此它会包裹将在其表面上显示的文本。
以下演示展示了如何创建和样式化两个基本按钮。请注意,由于 disabled 属性,第二个按钮无法点击
解剖结构
Button 组件由一个根 <button> 插槽组成,没有内部插槽
<button class="base-Button-root">
<!-- button text goes here -->
</button>
自定义结构
使用 slots.root 属性来使用自定义元素覆盖根插槽
<Button slots={{ root: 'div' }} />
如果您提供非交互元素(例如 <span>),Button 组件将自动添加必要的辅助功能属性。
将此演示中的 <span> 上的属性与前一个演示中的 Button 进行比较——尝试使用浏览器的开发者工具检查它们
与 TypeScript 一起使用
在 TypeScript 中,您可以将 slots.root 中使用的自定义组件类型指定为非样式化组件的泛型参数。 这样,您可以安全地直接在组件上提供自定义根的 props
<Button<typeof CustomComponent> slots={{ root: CustomComponent }} customProp />
相同的道理也适用于特定于自定义原始元素的 props
<Button<'img'> slots={{ root: 'img' }} src="button.png" />
Hook
import { useButton } from '@mui/base/useButton';
useButton hook 允许您将 Button 的功能应用于完全自定义的组件。 它返回要放置在自定义组件上的 props,以及表示组件内部状态的字段。
Hook 不支持 插槽 props,但它们支持 自定义 props。
以下演示展示了如何构建与上面的组件部分中相同的按钮,但使用 useButton hook
如果您使用 ref 来存储对按钮的引用,请将其传递给 useButton 的 ref 参数,如上面的演示所示。 它将与 hook 内部使用的 ref 合并。
自定义
自定义元素
Button 接受超出 HTML 元素的各种自定义元素。 您甚至可以使用 SVG,如下面的演示所示
与链接一起使用
以下演示说明了如何将 Button 用作链接,无论是使用 MUI Base Button 本身作为 href,还是使用 Next.js Link 组件
禁用按钮上的焦点
与原生的 HTML <button> 元素类似,Button 组件在禁用时无法接收焦点。 这可能会降低其可访问性,因为屏幕阅读器将无法宣布按钮的存在和状态。
focusableWhenDisabled 属性允许您更改此行为。 当设置此属性时,底层 Button 不会设置 disabled 属性。 而是使用 aria-disabled,这使得 Button 可聚焦。
每当需要屏幕阅读器读取禁用的 Button 时,都应使用此属性。
MUI Base 在 菜单项中内部使用此属性,从而可以使用键盘导航到禁用的项目(符合 ARIA 指南)。
以下演示展示了 focusableWhenDisabled 属性的工作方式——使用 Tab 键在此文档中导航,以查看只有第二个 Button 接受焦点
当根插槽被自定义时,focusableWhenDisabled 属性的工作方式相同,不同之处在于 aria-disabled 属性始终会被使用,无论属性的状态如何。 接收焦点的能力由 tabindex 属性在内部控制。