Button 按钮
触发操作的按钮,含分割、图标与复制按钮
安装
pnpm add @talex-touch/tuffex
import { TxButton, TxSplitButton, TxIconButton, TxCopyButton } from '@talex-touch/tuffex/button'
import '@talex-touch/tuffex/button/style.css'
import '@talex-touch/tuffex/base.css' // 设计令牌与重置样式,全应用引入一次
用法
变体
禁用
加载中
loading 期间按钮禁用;纯图标按钮的加载指示叠在图标上。
尺寸
size 有 sm、md、lg 三档,高度为 26、32、38px。
块级
block 撑满容器宽度;搭配 loadingVariant="bar" 时加载显示为扫光层。
形态
非块级 circle 的边长等于按钮高度;flat 变体的 sm 为 32px。
触感反馈
vibrate 需显式开启:点击时触发设备震动,并按强度轻晃按钮;不支持震动的设备也会晃动。
分割按钮
TxSplitButton 把主操作与 menu 插槽中的更多操作组合在一起。
主次搭配
主操作用 primary,次操作用 ghost。
图标按钮
label 提供可访问名称,pressed 表示持久切换态,status 设置语义色。
复制按钮
成功后显示 copiedLabel,失败时派发 error。
最佳实践
- 每个视图或卡片只放一个主按钮,次要动作用
ghost或secondary。 - 异步动作设置
loading,成功与失败路径都要撤下,避免按钮卡在禁用态。 - 只在表单内使用
nativeType="submit";默认的button不会意外提交表单。 - 纯图标动作用
TxIconButton并设置label;pressed只用于持久开关。 TxCopyButton的copyLabel写明复制对象;复制值关键时处理error,浏览器可能拒绝非用户手势的写入。
API 参考
TxButton
属性
| Parameter | Type | Default | Description |
|---|---|---|---|
variant | primary secondary ghost danger success warning info flat bare | 'secondary' | 视觉风格。 |
type | primary success warning danger info text | - | 语义别名,仅在未设置 variant 时生效;text 映射为 ghost。 |
size | sm md lg | 'md' | 高度 26 / 32 / 38px;旧值 large、small、mini 在运行时归一。 |
block | boolean | false | 撑满父容器宽度。 |
plain | boolean | false | 朴素样式。 |
dashed | boolean | false | 虚线边框。 |
round | boolean | false | 圆角形态。 |
circle | boolean | false | 圆形,用于纯图标按钮。 |
loading | boolean | false | 显示加载指示并禁止点击。 |
loading-variant | spinner bar | 'spinner' | 加载样式;bar 仅在 block 时渲染为扫光层。 |
disabled | boolean | false | 禁用按钮并阻止 click。 |
border | boolean | true | 为 false 时去掉边框色。 |
icon | string | - | 显示在文案前的图标类名。 |
autofocus | boolean | false | 挂载后自动聚焦。 |
native-type | button submit reset | 'button' | 原生 type 属性。 |
vibrate | boolean | false | 点击时触发设备震动与对应的按钮晃动。 |
vibrate-type | light medium heavy bit success warning error | 'light' | 震动强度。 |
视觉风格。
语义别名,仅在未设置 variant 时生效;text 映射为 ghost。
高度 26 / 32 / 38px;旧值 large、small、mini 在运行时归一。
撑满父容器宽度。
朴素样式。
虚线边框。
圆角形态。
圆形,用于纯图标按钮。
显示加载指示并禁止点击。
加载样式;bar 仅在 block 时渲染为扫光层。
禁用按钮并阻止 click。
为 false 时去掉边框色。
显示在文案前的图标类名。
挂载后自动聚焦。
原生 type 属性。
点击时触发设备震动与对应的按钮晃动。
震动强度。
事件
| Parameter | Type | Default | Description |
|---|---|---|---|
click | (event: MouseEvent) => void | - | 未禁用且未加载时点击触发。 |
未禁用且未加载时点击触发。
插槽
| 插槽名 | 说明 |
|---|---|
default | 文案或自定义内容,渲染在图标与加载指示之后。 |
TxSplitButton
属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
variant | 'primary' | 'secondary' | 'ghost' | 'danger' | 'success' | 'warning' | 'info' | primary | 主按钮与菜单按钮共用的变体。 |
size | 'sm' | 'md' | 'lg' | md | 高度 28 / 32 / 40px。 |
disabled | boolean | false | 同时禁用主操作与菜单触发器。 |
loading | boolean | false | 主按钮显示加载指示,两侧均禁用。 |
icon | string | - | 非加载时显示在文案前的图标类名。 |
menuIcon | string | i-ri-more-2-line | 菜单触发器的默认图标类名。 |
menuDisabled | boolean | false | 仅禁用菜单触发器。 |
menuWidth | number | 200 | 弹层宽度,透传给 TxPopover。 |
menuPlacement | 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end' | 'right-start' | 'right-end' | 'left-start' | 'left-end' | bottom-end | 弹层位置。 |
menuOffset | number | 8 | 弹层偏移(px)。 |
事件
| 事件名 | 参数 | 说明 |
|---|---|---|
click | (event: MouseEvent) | 主按钮在未禁用、未加载时点击触发。 |
menuOpenChange | (open: boolean) | 菜单打开状态变化时触发。 |
插槽
| 插槽名 | 参数 | 说明 |
|---|---|---|
default | - | 主操作文案。 |
menu | { close: () => void } | 弹层中的菜单内容;选择后调用 close()。 |
menu-icon | - | 替换菜单触发器的图标。 |
TxIconButton
属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
icon | string | '' | 无默认插槽时经 TxIcon 渲染的图标名。 |
label | string | '' | 可访问名称;纯图标时必填,缺失时开发环境告警。 |
size | 'xs' | 'sm' | 'md' | 'lg' | 'md' | 按钮尺寸。 |
shape | 'square' | 'circle' | 'pill' | 'square' | 点击区域轮廓。 |
status | 'success' | 'warning' | 'danger' | 'info' | - | 语义色,作用于图标、悬停、按下与焦点;不改变行为或权限。 |
pressed | boolean | - | 持久切换态,定义时输出 aria-pressed。 |
disabled | boolean | false | 原生禁用。 |
nativeType | 'button' | 'submit' | 'reset' | 'button' | 原生 type 属性。 |
事件
| 事件名 | 参数 | 说明 |
|---|---|---|
click | (event: MouseEvent) | 未禁用时点击触发。 |
插槽
| 插槽名 | Props | 说明 |
|---|---|---|
default | { hover, pressed } | 自定义图标或动画内容。 |
TxCopyButton
属性
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
text | string | '' | 写入剪贴板的文本。 |
copyLabel | string | 'Copy' | 空闲时的文案与 aria-label。 |
copiedLabel | string | 'Copied' | 复制成功后的文案与 aria-label。 |
disabled | boolean | false | 禁用并阻止复制。 |
timeout | number | 1400 | 成功状态恢复前的毫秒数。 |
size | 'sm' | 'md' | 'sm' | 按钮尺寸。 |
事件
| 事件名 | 参数 | 说明 |
|---|---|---|
copy | (text: string) | 写入剪贴板成功后触发。 |
error | (error: unknown) | 写入失败时触发。 |
插槽
| 插槽名 | Props | 说明 |
|---|---|---|
default | { copied, copying } | 自定义按钮内容。 |
类型
import type { TxButtonEmits, TxButtonProps, TxIconButtonProps, TxSplitButtonEmits, TxSplitButtonProps } from '@talex-touch/tuffex'
export interface ButtonProps extends TxButtonProps {}
export interface ButtonEmits extends TxButtonEmits {}
export interface SplitButtonProps extends TxSplitButtonProps {}
export interface SplitButtonEmits extends TxSplitButtonEmits {}
export interface IconButtonProps extends TxIconButtonProps {}
概述
variant优先于type;两者都未设置时为secondary。disabled与loading都禁用原生<button>并阻止click;TxSplitButton加载时两侧都禁用。- 非块级、非圆形按钮在
loading切换时以 FLIP 过渡宽度;block与circle并用时保持常规文案布局。 - 纯图标的
TxButton用aria-label等 attrs 命名;TxIconButton把label写入aria-label,布尔pressed写入aria-pressed。 TxCopyButton优先用 Clipboard API,不可用时回退到execCommand;禁用或写入中忽略点击。- 减少动态效果时跳过
vibrate的晃动。
技术实现
--tx-button-height同时决定按钮高度与非块级圆形按钮的宽度。- 源码:
packages/tuffex/packages/components/src/button/。
使用场景
- 页面与卡片动作、表单提交(
nativeType="submit")、抽屉底部操作(block)。 - 表格行与工具栏(
size="sm")、纯图标操作(circle或TxIconButton)。 - 带一组变体的主操作(
TxSplitButton)、复制到剪贴板(TxCopyButton)。