用于触发操作,如提交表单、保存内容或删除记录。
基础用法
solid 适合主要操作,soft 适合柔和强调,outline 适合次要操作,ghost 适合低优先级操作。
import { Button } from '@sudden3/leaf-ui';
export function ButtonVariants() {
return (
<>
<Button>主要按钮</Button>
<Button variant="soft">柔和按钮</Button>
<Button variant="outline">描边按钮</Button>
<Button variant="ghost">文字按钮</Button>
</>
);
}
使用前,在应用入口导入一次 @sudden3/leaf-ui/styles.css。接入步骤见快速开始。
危险操作
为删除、清空、撤销等操作使用 danger。所有样式、图标和加载状态都会使用独立的红色语义主题。
import { Button } from '@sudden3/leaf-ui';
import { Trash2 } from 'lucide-react';
export function ButtonDanger() {
return (
<>
<Button danger startIcon={<Trash2 />}>
删除项目
</Button>
<Button danger variant="soft">
移除成员
</Button>
<Button danger variant="outline">
撤销授权
</Button>
<Button danger variant="ghost">
清空
</Button>
<Button danger disabled>
禁止删除
</Button>
<Button danger loading>
正在删除
</Button>
</>
);
}
尺寸
提供小、中、大三种尺寸,适配不同密度的操作区。外观可通过主题变量定制。
import { Button } from '@sudden3/leaf-ui';
export function ButtonSizes() {
return (
<>
<Button size="sm">小按钮</Button>
<Button size="md">默认按钮</Button>
<Button size="lg">大按钮</Button>
</>
);
}
禁用与加载
加载时会显示旋转指示器,自动禁用按钮,并设置 aria-busy。原有文字保留,帮助用户理解正在进行的操作。
import { Button } from '@sudden3/leaf-ui';
export function ButtonStates() {
return (
<>
<Button disabled>暂不可用</Button>
<Button loading>加载中</Button>
<Button variant="outline" disabled>
已禁用
</Button>
</>
);
}
实际交互
通过应用状态控制 loading。下面的示例会在 1.2 秒后完成保存;实际使用时,把计时器替换成你的异步业务操作。
点击试试保存操作。
import { Button } from '@sudden3/leaf-ui';
import { useEffect, useRef, useState } from 'react';
export function ButtonLoading() {
const [status, setStatus] = useState<'idle' | 'loading' | 'saved'>('idle');
const timer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);
useEffect(() => () => clearTimeout(timer.current), []);
function save() {
clearTimeout(timer.current);
setStatus('loading');
// 示例模拟一次异步保存;实际使用时替换成你的业务请求。
timer.current = setTimeout(() => setStatus('saved'), 1200);
}
return (
<>
<Button loading={status === 'loading'} onClick={save}>
{status === 'loading' ? '正在保存' : status === 'saved' ? '再次保存' : '保存更改'}
</Button>
<span role="status">{status === 'saved' ? '更改已保存。' : '点击试试保存操作。'}</span>
</>
);
}
图标
示例使用 lucide-react 的按需导入图标。startIcon 和 endIcon 接受 React 节点。图标容器默认对辅助技术隐藏,按钮文字提供名称;只有图标时请设置 aria-label。
import { Button } from '@sudden3/leaf-ui';
import { ArrowRight, Plus, Trash2 } from 'lucide-react';
export function ButtonIcons() {
return (
<>
<Button startIcon={<Plus />}>新建项目</Button>
<Button variant="outline" endIcon={<ArrowRight />}>
继续下一步
</Button>
<Button variant="soft" aria-label="添加项目" startIcon={<Plus />} />
<Button danger variant="outline" aria-label="删除项目" startIcon={<Trash2 />} />
</>
);
}
整行显示
fullWidth 让按钮填满父容器宽度,适合表单提交和移动端操作区。
import { Button } from '@sudden3/leaf-ui';
export function ButtonFullWidth() {
return <Button fullWidth>继续下一步</Button>;
}
支持其他原生 button 属性,例如 onClick、name、value、form、className、style、aria-* 和 data-*。
类型
可导入 ButtonProps 定义组件属性,或单独使用以下样式、尺寸类型:
import type { ButtonProps, ButtonVariant, ButtonSize } from '@sudden3/leaf-ui';
表单与键盘
默认 type="button",放进表单时不会意外提交。需要提交表单,请显式设置 type="submit"。
组件保留原生键盘行为:Tab 聚焦,Enter 或 Space 触发。禁用和加载状态会阻止交互;聚焦时显示清晰的焦点轮廓。
定制样式
<ConfigProvider theme={{ primaryColor: '#7654c6', borderRadius: 18 }}>
<Button>自定义主题</Button>
</ConfigProvider>
配置选项与实时示例见定制主题。