v0.1.9

Button 按钮

引入import { Button } from '@apollo-design/ui';

按钮触发操作,或通过原生链接导航。

何时使用

用于提交表单、确认操作或触发当前页面中的动作。需要跳转时使用 href,由原生链接承载导航。

代码演示

加载中…

按钮类型 #

type 是 v5 及更早版本的「糖」写法,v6 里会被解析成 color + variant:

type color variant
primary primary solid
default default outlined
dashed default dashed
text default text
link link link

最后一颗按钮演示「两个中文字符自动插空格」:autoInsertSpace 默认为 true。

加载中…

按钮尺寸 #

size 的默认档是 medium(旧写法 middle 同样合法),此时不输出 -lg / -sm 类名。

加载中…

加载中 #

loading 有两种形态:

  • 布尔:true 立刻进入加载态。
  • 对象:{ delay, icon }。delay > 0 时延迟到点才置为加载态,用于防止连点; 变回 false 只能靠 loading prop 自己变回,不会自动复位。

加载中时点击被拦截(preventDefault 且不 emit click)。

加载中…

不可用状态 #

⚠️ 两个分支的 disabled 表达不对称,这是上游真实行为(不是笔误):

分支 表现
<button>(无 href) 原生 disabled 属性
<a>(有 href) 移除 href + tabindex="-1" + aria-disabled
加载中…

危险按钮 #

danger 会把解析出的 color 换成 danger。

⚠️ 类名上有两处不一致(上游真实行为):

  • -dangerous 用的是原始 danger prop
  • -color-dangerous 里 danger 被改写成 dangerous(不是 -color-danger)
加载中…

幽灵按钮 #

幽灵按钮把背景变透明,常用在有色背景上。

⚠️ ghost 对 solid 变体的处理是退化成 outlined(不是加个类了事)。

⚠️ 属性顺序有讲究:ghost 必须写在 danger 之后才不会被 danger 的样式压过。

加载中…

块级按钮 #

block 让按钮撑满父容器宽度(-block 类名 → width: 100%)。

加载中…

图标按钮 #

icon 在 v6 里是节点,不是 v4 的字符串名(传字符串且长度 > 2 会输出告警)。 也可以传组件 —— Vue 没有 React 的「元素」形态,对应物就是组件本身(差异 D42)。

  • icon prop 与 icon 插槽都能传图标,prop 优先(props.icon ?? slots.icon())。
  • iconPlacement="end" 把图标放到文字后面(靠 -icon-end 类名用 CSS 翻转, 不是调换 DOM 顺序)。
  • 没有默认插槽且有图标时加 -icon-only 类名。
  • loading 时图标换成加载图标(loading.icon > ConfigProvider 的 loadingIcon > 内置 LoadingOutlined)。 容器上额外带 -loading-icon 类名 —— ⚠️ 只在前两支都没提供自定义图标时才带; 一旦有自定义加载图标(prop 或 ConfigProvider),该类名不出现。
  • 插槽仍只接受 () => VNodeChild;组件要走 prop。
加载中…

按钮形状 #

shape 取 default 与 square 时不产出 -{shape} 类名,其余(circle / round)产出。

加载中…

颜色与变体 #

color + variant 是 v6 的新写法,同时给出时优先级最高(压过 type / danger)。

  • color:16 个预设语义色(含 default / primary / danger + 13 个色板色)
  • variant:outlined / dashed / solid / filled / text / link

⚠️ filled 在 ButtonTypeMap 里没有映射 ⇒ 只能由 variant 显式传入。

加载中…

链接按钮 #

传了 href 就渲染 <a> 而不是 <button>。此时 htmlType 无效、没有原生 disabled, 禁用靠「移除 href + tabindex="-1" + aria-disabled」。

加载中…

语义化 classNames / styles #

classNames / styles 各有三个槽位:root / icon / content。

合并优先级(低 → 高):

⚠️ 与 antd 的差异:本仓库不支持函数式变体(classNames / styles 只接受对象), 依据 empty-semantic-fn 开放决策的建议 B,与已完成的 divider / empty / space / spin 一致。

加载中…

组件 Token #

通过当前 ConfigProvider.theme.components.Button 修改已有 Token,并保留 Alias 主色/圆角定制。支持动态配置、移除恢复、原生根变量覆盖;草稿和点击计数用于观察内容与状态是否保留。

主按钮默认使用浅色文字;“自定义主按钮文字”演示 primaryColor 的显式覆盖,关闭后恢复默认白字。浅色实心背景会限制过高亮度以保持文字可读性;自定义前景、渐变和透明背景需自行配对。

加载中…

中文 loading #

两个中文字按钮在 loading 态下仍会保持自动插入的间距,可点击「提交」观察加载到完成的切换。

加载中…

中文间距 #

autoInsertSpace 控制两个中文字之间是否自动插入空格,默认开启;对比点击可观察间距差异。

加载中…

图标位置 #

iconPlacement 取 'start' 或 'end',控制 icon 相对文字的位置;仅图标按钮可配合 shape="circle"。

加载中…

自定义禁用背景 #

通过 ConfigProvider 的 theme.token 覆盖 colorBgContainerDisabled、colorBorderDisabled 与 colorTextDisabled,统一改变禁用按钮配色。

加载中…

线性渐变 #

用自定义类覆盖主按钮的 background-image,实现线性渐变;悬停与按下状态使用同色系更亮的渐变。禁用按钮保留组件自身的禁用样式。

加载中…

多个按钮 #

把一组相关按钮放进 role="group" 容器并设置 aria-label,辅助技术会把它们读作一个操作组。每个按钮都有可见文本,点击结果通过 aria-live 区域反馈。

加载中…

语义化样式与类 #

Button 提供 root / content / icon 三个语义槽。classNames 拼接类名,styles 覆盖对应槽位的样式;示例分别调整根节点圆角与内边距、文本字距和图标颜色。

保留全部 20 个原示例:basic, block, chinese-chars-loading, chinese-space, color-variant, component-token, custom-disabled-bg, danger, disabled, ghost, href, icon, icon-placement, linear-gradient, loading, multiple, semantic, shape, size, style-class.

API

Props

参数 说明 类型 默认值
type 视觉类型糖,显式 color/variant 可分别覆盖 ButtonType 'default'
color 独立生效的语义色或预设色 ButtonColorType —
variant 独立生效的视觉变体 ButtonVariantType —
icon 图标数据或 Vue 组件;#icon 优先 ButtonIcon —
iconPosition 已有废弃别名,使用 iconPlacement ButtonIconPlacement —
iconPlacement 图标位置,覆盖已有别名 ButtonIconPlacement 'start'
shape 形状;square 为方角 ButtonShape 'default'
size 尺寸,依次取局部、Compact、Provider ButtonSize —
disabled 禁用;显式 false 覆盖父级 true boolean —
loading 请求立即阻止点击,delay 只推迟指示器 ButtonLoading false
prefixCls 根类名前缀 string apollo-btn
ghost 透明背景;solid 映射为 outlined boolean false
danger 危险颜色糖,低于显式 color boolean false
block 撑满容器 boolean false
href 定义时渲染 a,空字符串也是有效链接值 string —
htmlType button 根的原生 type ButtonHTMLType 'button'
autoInsertSpace 两个中文字的视觉字距,保留连续原文 boolean true
classNames root/icon/content 对象式类名 ButtonSemanticClassNames —
styles root/icon/content 对象式样式 ButtonSemanticStyles —

ButtonType: default / primary / dashed / link / text. ButtonShape: default / circle / round / square. ButtonSize: small / medium / middle / large. ButtonVariantType: outlined / dashed / solid / filled / text / link. ButtonColorType: default / primary / danger / blue / purple / cyan / green / magenta / pink / red / orange / yellow / volcano / geekblue / lime / gold. ButtonHTMLType: button / submit / reset. ButtonIconPlacement: start / end. ButtonIcon = VNodeChild | Component; ButtonLoading = boolean | { delay?: number; icon?: ButtonIcon }.

当前配置与原生属性

color、variant 各自先取显式值,再取 type/danger 糖,最后取当前 Provider;没有颜色时 solid 用 primary,其他变体用 default。显式 color 优先于 danger。ghost 把 solid 映射为 outlined。Provider 替换、删除、恢复均使用当前配置。

Vue class、字符串/对象/数组 style 和其他原生 attrs 落在真实 button/anchor 根;原生 style 优先于语义根样式和源 Token。表单属性、原生事件正常消费。启用链接尊重调用者 tabindex;禁用时移除 href 并强制 tabindex=-1。自定义前缀需配套静态 CSS,例如 genButtonStyle('my-app') 对应 .my-app-btn。

插槽

名称 内容
default 完整 Vue 内容;注释和空 Fragment 不产生空宿主
icon 完整 Vue 图标内容,优先于 icon 数据;有意空槽隐藏回退

组件拥有的 .apollo-btn-content 接收 content 类和样式。业务子 VNode、文字、状态和 ref 保持原样;中文字距由 CSS 实现,DOM 和可访问名保留连续原文。语义样式仅接受对象,不包含函数式 API。

Emits 与 ref

click 发出一次原生 MouseEvent。disabled 或加载请求阻止激活、默认提交和事件传播,延迟显示期间也不触发 click。加载保留焦点,通过 aria-busy/aria-disabled 表达状态。有限正 delay 只延迟指示器;取消或卸载清理,单独替换图标不重计时,SSR 不创建计时器。内置加载图形为装饰;仅图标按钮应通过 aria-label 提供操作名称。

唯一 expose 是 nativeElement: HTMLButtonElement | HTMLAnchorElement | null,挂载前及卸载后为 null。没有 v-model 或其他 focus/blur 服务。

组件 Token 与导出

下列 45 个显式字段及 13 个已有预设阴影字段均消费当前 theme.components.Button。原生根变量(如 --apollo-btn-content-font-size)优先。数字长度转 px,字重/行高为无单位;有限非负尺寸保留 0,无效数字尺寸回退。移除源配置恢复继承/静态默认值。

Token 职责
fontWeight 字重
iconGap 图标与内容间距
defaultShadow 阴影
primaryShadow 阴影
dangerShadow 阴影
primaryColor 主色实心按钮三态文字色,默认 colorTextLightSolid(白色)
defaultColor 对应颜色及状态的文字、背景或边框
defaultBg 对应颜色及状态的文字、背景或边框
defaultBorderColor 对应颜色及状态的文字、背景或边框
dangerColor 危险实心按钮三态文字色,默认 colorTextLightSolid(白色)
defaultHoverBg 对应颜色及状态的文字、背景或边框
defaultHoverColor 对应颜色及状态的文字、背景或边框
defaultHoverBorderColor 对应颜色及状态的文字、背景或边框
defaultActiveBg 对应颜色及状态的文字、背景或边框
defaultActiveColor 对应颜色及状态的文字、背景或边框
defaultActiveBorderColor 对应颜色及状态的文字、背景或边框
borderColorDisabled 对应颜色及状态的文字、背景或边框
defaultBorderColorDisabled 对应颜色及状态的文字、背景或边框
groupBorderColor 组及 Compact 接缝
defaultGhostColor 对应颜色及状态的文字、背景或边框
ghostBg 对应颜色及状态的文字、背景或边框
defaultGhostBorderColor 对应颜色及状态的文字、背景或边框
solidTextColor 默认及预设实心按钮的显式文字色;不覆盖 primaryColor/dangerColor
textTextColor 对应颜色及状态的文字、背景或边框
textTextHoverColor 对应颜色及状态的文字、背景或边框
textTextActiveColor 对应颜色及状态的文字、背景或边框
paddingInline 对应尺寸内边距
paddingInlineLG 对应尺寸内边距
paddingInlineSM 对应尺寸内边距
paddingBlock 对应尺寸内边距
paddingBlockLG 对应尺寸内边距
paddingBlockSM 对应尺寸内边距
onlyIconSize 仅图标尺寸
onlyIconSizeLG 仅图标尺寸
onlyIconSizeSM 仅图标尺寸
linkHoverBg 对应颜色及状态的文字、背景或边框
textHoverBg 对应颜色及状态的文字、背景或边框
contentFontSize 对应尺寸字号
contentFontSizeLG 对应尺寸字号
contentFontSizeSM 对应尺寸字号
contentLineHeight 对应尺寸行高
contentLineHeightLG 对应尺寸行高
contentLineHeightSM 对应尺寸行高
defaultBgDisabled 对应颜色及状态的文字、背景或边框
dashedBgDisabled 对应颜色及状态的文字、背景或边框

预设阴影:blueShadowColor, purpleShadowColor, cyanShadowColor, greenShadowColor, magentaShadowColor, pinkShadowColor, redShadowColor, orangeShadowColor, yellowShadowColor, volcanoShadowColor, geekblueShadowColor, limeShadowColor, goldShadowColor.

<ConfigProvider :theme="{components:{Button:{contentFontSize:18,paddingInline:24}}}">
  <Button type="primary">Save</Button>
</ConfigProvider>

主色与危险实心按钮默认使用 colorTextLightSolid,普通、悬停、按下均保持浅色文字,不使用自动黑白前景替换。支持相对颜色的浏览器会限制这些实心背景的过高亮度,保证默认白字可读性,保留全局 Alias 原值。默认及预设实心按钮保留自动前景;彩色文字保留原生 CSS 明度修正。显式前景 Token 和原生样式优先;自定义文字、透明及渐变表面须按实际背景配对。不支持的色值函数保留 Alias 回退,实际验证范围见审计记录。

Button、genButtonStyle、prepareButtonComponentToken 从 @apollo-design/ui 和 @apollo-design/ui/button 导出。类型含 ButtonProps、ButtonRef、ButtonSlots、ButtonSlot、ButtonConfig、上述枚举/语义类型、ButtonComponentToken、ButtonTokenInput。旧文档中的 button/style/token 不是包导出路径。

import '@apollo-design/theme/tokens.css';
import '@apollo-design/ui/button/style.css';
// Or import '@apollo-design/ui/style.css';

契约迁移。

Powered by Vue 3 + ViteApollo Design · Vue NativeGitHub