组件 · 通用

Button 动作按钮

用于查询、保存、提交等动作;loading 只描述外部受控忙碌状态,阻止再次激活并保留动作名称与焦点。页面跳转应使用链接语义,不要把按钮当正文链接。

何时使用

  • 用于提交表单、保存、删除等需要用户明确触发的即时动作。
  • 同一区域只放一个 solid 主操作,其余用 outline / ghost 降低层级。
  • 页面跳转使用链接语义;可用 buttonVariants() 为原生链接提供按钮外观。

颜色、展示方式、尺寸彼此独立。激活、禁用与 loading 拦截由 Headless Button 承担,UI 提供主题外观与忙碌图标。 loading 由调用方受控。未提供 size 时读取最近的 ConfigProvider.size,无配置时使用 md;显式 size 优先。

引入

从 @selrux/ui/button 引入 Button。组件样式随入口自动引入,无需额外导入全量样式。 需要统一尺寸、语言或主题时,使用 @selrux/ui/config-provider 的 ConfigProvider;基础按钮不要求额外 provider。

演练场

调节语义色、展示方式、尺寸与加载等属性,实时预览真实 Button。

代码演示

查询按钮

基础用法

默认语义色为 primary,展示方式为 solid。没有配置域时尺寸为 md。

语义色

八个实底语义色。destructive 默认引用 error,不另造品牌色;实底除 secondary、accent 外为白字,随前景 Token 调整。

展示方式

四种展示方式可与语义色组合。纯样式函数的非法值回退默认;组件调用应由 TypeScript 检查合法值。

尺寸

六档视觉尺寸。未写 size 时读取最近 ConfigProvider 的 size;不存在 icon 或 default 尺寸档。

加载状态

loading 保留可见动作名称,忙碌标记跟在文字后;纯图标时替换图标槽。示例中的定时器仅模拟保存,实际业务应使用真实请求并在结束时恢复状态。

禁用状态

使用原生 disabled 属性禁用按钮。禁用按钮不能激活;不要仅通过 CSS 模拟禁用。

纯图标按钮

纯图标使用普通尺寸档,必须提供 aria-label。图文混排时图标与文字同放在子节点;示例附带完整 SVG,不依赖未定义图标。

API

Button

动作按钮。ref 指向实际的 button。

ts
(props: ButtonProps & React.RefAttributes<HTMLButtonElement>) => React.ReactNode
属性类型可选默认值 / 证据说明来源
color"primary" | "destructive" | "success" | "warning" | "info" | "carbon" | "secondary" | "accent"是primary(语义色。省略为 primary。)语义色。省略为 primary。ui: @selrux/ui/dist/types/components/button/button-props.d.ts
variant"link" | "solid" | "outline" | "ghost"是solid(展示方式。省略为 solid。)展示方式。省略为 solid。ui: @selrux/ui/dist/types/components/button/button-props.d.ts
size"xs" | "sm" | "md" | "lg" | "xl" | "2xl"是未声明;见说明/约束尺寸。省略时使用 ConfigProvider,无配置时为 md。ui: @selrux/ui/dist/types/components/button/button-props.d.ts
loadingboolean是false(为真时阻止再次激活,并保留动作名称和焦点。)为真时阻止再次激活,并保留动作名称和焦点。ui: @selrux/ui/dist/types/components/button/button-props.d.ts
loadingLabelstring是未声明;见说明/约束忙碌辅助说明。省略时使用当前语言包。ui: @selrux/ui/dist/types/components/button/button-props.d.ts
disabledboolean是未声明;见说明/约束react-native: @types/react/index.d.ts
formstring是未声明;见说明/约束react-native: @types/react/index.d.ts
type"button" | "submit" | "reset"是未声明;见说明/约束react-native: @types/react/index.d.ts
classNamestring是未声明;见说明/约束react-native: @types/react/index.d.ts
aria-labelstring是未声明;见说明/约束Defines a string value that labels the current element.react-native: @types/react/index.d.ts
onClickMouseEventHandler<HTMLButtonElement>是未声明;见说明/约束react-native: @types/react/index.d.ts
refRef<HTMLButtonElement>是未声明;见说明/约束Allows getting a ref to the component instance. Once the component unmounts, React will set ref.current to null (or call the ref with null if you passed a callback ref).react-native: @types/react/index.d.ts
keyKey | null是未声明;见说明/约束react-native: @types/react/index.d.ts
childrenReactNode是未声明;见说明/约束按钮内容。图标作为子节点组合。ui: @selrux/ui/dist/types/components/button/button-props.d.ts

其余 280 个 React 原生属性按继承汇总;关键原生属性已展开。

ButtonColor

八个实底语义色。destructive 默认引用 error,不另造第九个品牌色。

ts
"primary" | "destructive" | "success" | "warning" | "info" | "carbon" | "secondary" | "accent"

ButtonProps

动作按钮属性。loading 只描述外部受控的忙碌状态。

ts
ButtonProps
属性类型可选默认值 / 证据说明来源
color"primary" | "destructive" | "success" | "warning" | "info" | "carbon" | "secondary" | "accent"是primary(语义色。省略为 primary。)语义色。省略为 primary。ui: @selrux/ui/dist/types/components/button/button-props.d.ts
variant"link" | "solid" | "outline" | "ghost"是solid(展示方式。省略为 solid。)展示方式。省略为 solid。ui: @selrux/ui/dist/types/components/button/button-props.d.ts
size"xs" | "sm" | "md" | "lg" | "xl" | "2xl"是未声明;见说明/约束尺寸。省略时使用 ConfigProvider,无配置时为 md。ui: @selrux/ui/dist/types/components/button/button-props.d.ts
loadingboolean是false(为真时阻止再次激活,并保留动作名称和焦点。)为真时阻止再次激活,并保留动作名称和焦点。ui: @selrux/ui/dist/types/components/button/button-props.d.ts
loadingLabelstring是未声明;见说明/约束忙碌辅助说明。省略时使用当前语言包。ui: @selrux/ui/dist/types/components/button/button-props.d.ts
disabledboolean是未声明;见说明/约束react-native: @types/react/index.d.ts
formstring是未声明;见说明/约束react-native: @types/react/index.d.ts
type"button" | "submit" | "reset"是未声明;见说明/约束react-native: @types/react/index.d.ts
classNamestring是未声明;见说明/约束react-native: @types/react/index.d.ts
aria-labelstring是未声明;见说明/约束Defines a string value that labels the current element.react-native: @types/react/index.d.ts
onClickMouseEventHandler<HTMLButtonElement>是未声明;见说明/约束react-native: @types/react/index.d.ts
childrenReactNode是未声明;见说明/约束按钮内容。图标作为子节点组合。ui: @selrux/ui/dist/types/components/button/button-props.d.ts

其余 280 个 React 原生属性按继承汇总;关键原生属性已展开。

ButtonSize

六档视觉尺寸。默认档来自 ConfigProvider,无配置时为 md。

ts
"xs" | "sm" | "md" | "lg" | "xl" | "2xl"

ButtonVariant

展示方式。只开放实底、描边、弱化和链接。

ts
"link" | "solid" | "outline" | "ghost"

ButtonVariantOptions

buttonVariants 接受的颜色、变体和尺寸。

ts
ButtonVariantOptions
属性类型可选默认值 / 证据说明来源
color"primary" | "destructive" | "success" | "warning" | "info" | "carbon" | "secondary" | "accent"是未声明;见说明/约束语义色。省略或非法时为 primary。ui: @selrux/ui/dist/types/components/button/button-variants.d.ts
variant"link" | "solid" | "outline" | "ghost"是未声明;见说明/约束展示方式。省略或非法时为 solid。ui: @selrux/ui/dist/types/components/button/button-variants.d.ts
size"xs" | "sm" | "md" | "lg" | "xl" | "2xl"是未声明;见说明/约束尺寸。省略或非法时为 md,不会读取 ConfigProvider。ui: @selrux/ui/dist/types/components/button/button-variants.d.ts
classNamestring是未声明;见说明/约束追加到结果末尾的类名。不做冲突合并。ui: @selrux/ui/dist/types/components/button/button-variants.d.ts

其余 0 个 React 原生属性按继承汇总;关键原生属性已展开。

  • loading 阻止再次激活并保留焦点;loading 的 submit 按钮不会再次提交表单。
  • disabled 使用原生禁用语义。只有一个元素子节点时按纯图标按钮处理。
  • 不支持旧属性 appearance、beforeClick、autoLoading、asChild,也不支持 variant="dashed"、variant="default"、size="default"、size="icon"。
  • 当前状态为 preview;部分默认前景组合不承诺 4.5:1 对比度。调用方仍需检查实际主题。

事件

onClick 在激活时触发,loading 或 disabled 时由 Headless 拦截。其余原生事件 onFocus、onBlur、onKeyDown 等透传到实际 button。

buttonVariants

纯样式函数组合基础类、语义色、展示方式、尺寸与附加类,不读取 ConfigProvider,不处理事件。className 追加在末尾,不做冲突合并。

组合基础类、语义色、变体、尺寸和可选附加类。

ts
(options?: ButtonVariantOptions) => string
tsx
import { buttonVariants } from '@selrux/ui/button';

/** 保留原生链接语义,仅复用 Button 视觉类。 */
export function LinkButtonExample() {
  return <a href="/docs" className={buttonVariants({ size: 'lg', variant: 'outline', className: 'extra' })}>阅读文档</a>;
}

无障碍

  • 渲染原生 button,支持 Tab 聚焦、Enter / Space 激活。
  • loading 保留动作名称与焦点;忙碌辅助说明来自 loadingLabel 或当前语言包。
  • 忙碌图标带 aria-hidden="true",避免读屏重复朗读;纯图标按钮必须提供 aria-label。
  • 焦点环使用 --srx-focus-ring / --srx-focus-width Token,不能用全局样式移除。

关联 ButtonGroup、ConfigProvider 与 Icon。主题编辑器和演练场可用于验证真实主题与组件组合。

文档快照:edbed4e3949112ae4797ba611a523984