Button按钮
按钮用于开始一个即时操作。
何时使用#
标记了一个(或封装一组)操作命令,响应用户点击行为,触发相应的业务逻辑。
在 Infra Design 中我们提供了五种按钮。
主按钮:用于主行动点,一个操作区域只能有一个主按钮。
默认按钮:用于没有主次之分的一组行动点。
虚线按钮:常用于添加操作。
文本按钮:用于最次级的行动点。
链接按钮:一般用于链接,即导航至某位置。
以及四种状态属性与上面配合使用。
危险:删除/移动/修改权限等危险操作,一般需要二次确认。
幽灵:用于背景色比较复杂的地方,常用在首页/产品页等展示场景。
禁用:行动点不可用的时候,一般需要文案解释。
加载中:用于异步操作等待反馈的时候,也可以避免多次提交。
代码演示
TypeScript
JavaScript
import { Button } from 'infrad';
import React from 'react';
const App: React.FC = () => (
<>
<Button type="primary">Primary Button</Button>
<Button>Default Button</Button>
<Button type="dashed">Dashed Button</Button>
<br />
<Button type="text">Text Button</Button>
<Button type="link">Link Button</Button>
</>
);
export default App;
TypeScript
JavaScript
import { IDownload } from 'infra-design-icons';
import { Button, Radio } from 'infrad';
import type { SizeType } from 'infrad/es/config-provider/SizeContext';
import React, { useState } from 'react';
const App: React.FC = () => {
const [size, setSize] = useState<SizeType>('large');
return (
<>
<Radio.Group value={size} onChange={e => setSize(e.target.value)}>
<Radio.Button value="large">Large</Radio.Button>
<Radio.Button value="default">Default</Radio.Button>
<Radio.Button value="small">Small</Radio.Button>
</Radio.Group>
<br />
<br />
<Button type="primary" size={size}>
Primary
</Button>
<Button size={size}>Default</Button>
<Button type="dashed" size={size}>
Dashed
</Button>
<br />
<Button type="link" size={size}>
Link
</Button>
<br />
<Button type="primary" icon={<IDownload />} size={size} />
<Button type="primary" shape="circle" icon={<IDownload />} size={size} />
<Button type="primary" shape="round" icon={<IDownload />} size={size} />
<Button type="primary" shape="round" icon={<IDownload />} size={size}>
Download
</Button>
<Button type="primary" icon={<IDownload />} size={size}>
Download
</Button>
</>
);
};
export default App;
TypeScript
JavaScript
import { PoweroffOutlined } from 'infra-design-icons';
import { Button, Space } from 'infrad';
import React, { useState } from 'react';
const App: React.FC = () => {
const [loadings, setLoadings] = useState<boolean[]>([]);
const enterLoading = (index: number) => {
setLoadings(prevLoadings => {
const newLoadings = [...prevLoadings];
newLoadings[index] = true;
return newLoadings;
});
setTimeout(() => {
setLoadings(prevLoadings => {
const newLoadings = [...prevLoadings];
newLoadings[index] = false;
return newLoadings;
});
}, 6000);
};
return (
<>
<Space style={{ width: '100%' }}>
<Button type="primary" loading>
Loading
</Button>
<Button type="primary" size="small" loading>
Loading
</Button>
<Button type="primary" icon={<PoweroffOutlined />} loading />
</Space>
<Space style={{ width: '100%' }}>
<Button type="primary" loading={loadings[0]} onClick={() => enterLoading(0)}>
Click me!
</Button>
<Button
type="primary"
icon={<PoweroffOutlined />}
loading={loadings[1]}
onClick={() => enterLoading(1)}
>
Click me!
</Button>
<Button
type="primary"
icon={<PoweroffOutlined />}
loading={loadings[2]}
onClick={() => enterLoading(2)}
/>
</Space>
</>
);
};
export default App;
TypeScript
JavaScript
import { Button } from 'infrad';
import React from 'react';
const App: React.FC = () => (
<div className="site-button-ghost-wrapper">
<Button type="primary" ghost>
Primary
</Button>
<Button ghost>Default</Button>
<Button type="dashed" ghost>
Dashed
</Button>
<Button type="primary" danger ghost>
Danger
</Button>
</div>
);
export default App;
.site-button-ghost-wrapper {
padding: 26px 16px 16px;
background: rgb(190, 200, 200);
}
TypeScript
JavaScript
import { Button } from 'infrad';
import React from 'react';
const App: React.FC = () => (
<>
<Button type="primary" block>
Primary
</Button>
<Button block>Default</Button>
<Button type="dashed" block>
Dashed
</Button>
<Button type="link" block>
Link
</Button>
</>
);
export default App;
TypeScript
JavaScript
import { ISearch } from 'infra-design-icons';
import { Button, Tooltip } from 'infrad';
import React from 'react';
const App: React.FC = () => (
<>
<Tooltip title="search">
<Button type="primary" shape="circle" icon={<ISearch />} />
</Tooltip>
<Button type="primary" shape="circle">
A
</Button>
<Button type="primary" icon={<ISearch />}>
Search
</Button>
<Tooltip title="search">
<Button shape="circle" icon={<ISearch />} />
</Tooltip>
<Button icon={<ISearch />}>Search</Button>
<br />
<Tooltip title="search">
<Button shape="circle" icon={<ISearch />} />
</Tooltip>
<Button icon={<ISearch />}>Search</Button>
<Tooltip title="search">
<Button type="dashed" shape="circle" icon={<ISearch />} />
</Tooltip>
<Button type="dashed" icon={<ISearch />}>
Search
</Button>
<Button icon={<ISearch />} href="https://www.google.com" />
<br />
<br />
<Tooltip title="search">
<Button type="primary" shape="circle" icon={<ISearch />} size="large" />
</Tooltip>
<Button type="primary" shape="circle" size="large">
A
</Button>
<Button type="primary" icon={<ISearch />} size="large">
Search
</Button>
<Tooltip title="search">
<Button shape="circle" icon={<ISearch />} size="large" />
</Tooltip>
<Button icon={<ISearch />} size="large">
Search
</Button>
<br />
<Tooltip title="search">
<Button shape="circle" icon={<ISearch />} size="large" />
</Tooltip>
<Button icon={<ISearch />} size="large">
Search
</Button>
<Tooltip title="search">
<Button type="dashed" shape="circle" icon={<ISearch />} size="large" />
</Tooltip>
<Button type="dashed" icon={<ISearch />} size="large">
Search
</Button>
<Button icon={<ISearch />} size="large" href="https://www.google.com" />
</>
);
export default App;
TypeScript
JavaScript
import { Button } from 'infrad';
import React from 'react';
const App: React.FC = () => (
<>
<Button type="primary">Primary</Button>
<Button type="primary" disabled>
Primary(disabled)
</Button>
<br />
<Button>Default</Button>
<Button disabled>Default(disabled)</Button>
<br />
<Button type="dashed">Dashed</Button>
<Button type="dashed" disabled>
Dashed(disabled)
</Button>
<br />
<Button type="text">Text</Button>
<Button type="text" disabled>
Text(disabled)
</Button>
<br />
<Button type="link">Link</Button>
<Button type="link" disabled>
Link(disabled)
</Button>
<br />
<Button danger>Danger Default</Button>
<Button danger disabled>
Danger Default(disabled)
</Button>
<br />
<Button danger type="text">
Danger Text
</Button>
<Button danger type="text" disabled>
Danger Text(disabled)
</Button>
<br />
<Button type="link" danger>
Danger Link
</Button>
<Button type="link" danger disabled>
Danger Link(disabled)
</Button>
<div className="site-button-ghost-wrapper">
<Button ghost>Ghost</Button>
<Button ghost disabled>
Ghost(disabled)
</Button>
</div>
</>
);
export default App;
.site-button-ghost-wrapper {
padding: 8px 8px 0 8px;
background: rgb(190, 200, 200);
}
TypeScript
JavaScript
import type { MenuProps } from 'infrad';
import { Button, Dropdown, Menu } from 'infrad';
import React from 'react';
const onMenuClick: MenuProps['onClick'] = e => {
console.log('click', e);
};
const menu = (
<Menu
onClick={onMenuClick}
items={[
{
key: '1',
label: '1st item',
},
{
key: '2',
label: '2nd item',
},
{
key: '3',
label: '3rd item',
},
]}
/>
);
const App: React.FC = () => (
<>
<Button type="primary">primary</Button>
<Button>secondary</Button>
<Dropdown.Button overlay={menu}>Actions</Dropdown.Button>
</>
);
export default App;
TypeScript
JavaScript
import { Button } from 'infrad';
import React from 'react';
const App: React.FC = () => (
<>
<Button type="primary" danger>
Primary
</Button>
<Button danger>Default</Button>
<Button type="dashed" danger>
Dashed
</Button>
<Button type="text" danger>
Text
</Button>
<Button type="link" danger>
Link
</Button>
</>
);
export default App;
API#
通过设置 Button 的属性来产生不同的按钮样式,推荐顺序为:type
-> shape
-> size
-> loading
-> disabled
。
按钮的属性说明如下:
属性 | 说明 | 类型 | 默认值 | 版本 |
---|---|---|---|---|
block | 将按钮宽度调整为其父宽度的选项 | boolean | false | |
danger | 设置危险按钮 | boolean | false | |
disabled | 按钮失效状态 | boolean | false | |
ghost | 幽灵属性,使按钮背景透明 | boolean | false | |
href | 点击跳转的地址,指定此属性 button 的行为和 a 链接一致 | string | - | |
htmlType | 设置 button 原生的 type 值,可选值请参考 HTML 标准 | string | button | |
icon | 设置按钮的图标组件 | ReactNode | - | |
loading | 设置按钮载入状态 | boolean | { delay: number } | false | |
shape | 设置按钮形状 | default | circle | round | 'default' | |
size | 设置按钮大小 | large | middle | small | middle | |
target | 相当于 a 链接的 target 属性,href 存在时生效 | string | - | |
type | 设置按钮类型 | primary | ghost | dashed | link | text | default | default | |
onClick | 点击按钮时的回调 | (event) => void | - |
支持原生 button 的其他所有属性。
FAQ#
如何移除两个汉字之间的空格?#
根据 Infra Design 设计规范要求,我们会在按钮内(文本按钮和链接按钮除外)只有两个汉字时自动添加空格,如果你不需要这个特性,可以设置 ConfigProvider 的 autoInsertSpaceInButton
为 false
。