Tag标签
进行标记和分类的小标签。
何时使用#
用于标记事物的属性和维度。
进行分类。
代码演示
import { Tag } from 'antd';
function log(e) {
console.log(e);
}
function preventDefault(e) {
e.preventDefault();
console.log('Clicked! But prevent default.');
}
ReactDOM.render(
<>
<Tag>Tag 1</Tag>
<Tag>
<a href="https://github.com/ant-design/ant-design/issues/1862">Link</a>
</Tag>
<Tag closable onClose={log}>
Tag 2
</Tag>
<Tag closable onClose={preventDefault}>
Prevent Default
</Tag>
</>,
mountNode,
);
import { Tag, Input, Tooltip } from 'antd';
import { PlusOutlined } from '@ant-design/icons';
class EditableTagGroup extends React.Component {
state = {
tags: ['Unremovable', 'Tag 2', 'Tag 3'],
inputVisible: false,
inputValue: '',
editInputIndex: -1,
editInputValue: '',
};
handleClose = removedTag => {
const tags = this.state.tags.filter(tag => tag !== removedTag);
console.log(tags);
this.setState({ tags });
};
showInput = () => {
this.setState({ inputVisible: true }, () => this.input.focus());
};
handleInputChange = e => {
this.setState({ inputValue: e.target.value });
};
handleInputConfirm = () => {
const { inputValue } = this.state;
let { tags } = this.state;
if (inputValue && tags.indexOf(inputValue) === -1) {
tags = [...tags, inputValue];
}
console.log(tags);
this.setState({
tags,
inputVisible: false,
inputValue: '',
});
};
handleEditInputChange = e => {
this.setState({ editInputValue: e.target.value });
};
handleEditInputConfirm = () => {
this.setState(({ tags, editInputIndex, editInputValue }) => {
const newTags = [...tags];
newTags[editInputIndex] = editInputValue;
return {
tags: newTags,
editInputIndex: -1,
editInputValue: '',
};
});
};
saveInputRef = input => {
this.input = input;
};
saveEditInputRef = input => {
this.editInput = input;
};
render() {
const { tags, inputVisible, inputValue, editInputIndex, editInputValue } = this.state;
return (
<>
{tags.map((tag, index) => {
if (editInputIndex === index) {
return (
<Input
ref={this.saveEditInputRef}
key={tag}
size="small"
className="tag-input"
value={editInputValue}
onChange={this.handleEditInputChange}
onBlur={this.handleEditInputConfirm}
onPressEnter={this.handleEditInputConfirm}
/>
);
}
const isLongTag = tag.length > 20;
const tagElem = (
<Tag
className="edit-tag"
key={tag}
closable={index !== 0}
onClose={() => this.handleClose(tag)}
>
<span
onDoubleClick={e => {
if (index !== 0) {
this.setState({ editInputIndex: index, editInputValue: tag }, () => {
this.editInput.focus();
});
e.preventDefault();
}
}}
>
{isLongTag ? `${tag.slice(0, 20)}...` : tag}
</span>
</Tag>
);
return isLongTag ? (
<Tooltip title={tag} key={tag}>
{tagElem}
</Tooltip>
) : (
tagElem
);
})}
{inputVisible && (
<Input
ref={this.saveInputRef}
type="text"
size="small"
className="tag-input"
value={inputValue}
onChange={this.handleInputChange}
onBlur={this.handleInputConfirm}
onPressEnter={this.handleInputConfirm}
/>
)}
{!inputVisible && (
<Tag className="site-tag-plus" onClick={this.showInput}>
<PlusOutlined /> New Tag
</Tag>
)}
</>
);
}
}
ReactDOM.render(<EditableTagGroup />, mountNode);
.site-tag-plus {
background: #fff;
border-style: dashed;
}
.edit-tag {
user-select: none;
}
.tag-input {
width: 78px;
margin-right: 8px;
vertical-align: top;
}
import { Tag, Button } from 'antd';
class Demo extends React.Component {
state = {
visible: true,
};
render() {
return (
<>
<Tag
closable
visible={this.state.visible}
onClose={() => this.setState({ visible: false })}
>
Movies
</Tag>
<br />
<Button size="small" onClick={() => this.setState({ visible: !this.state.visible })}>
Toggle
</Button>
</>
);
}
}
ReactDOM.render(<Demo />, mountNode);
import { Tag } from 'antd';
import {
TwitterOutlined,
YoutubeOutlined,
FacebookOutlined,
LinkedinOutlined,
} from '@ant-design/icons';
ReactDOM.render(
<>
<Tag icon={<TwitterOutlined />} color="#55acee">
Twitter
</Tag>
<Tag icon={<YoutubeOutlined />} color="#cd201f">
Youtube
</Tag>
<Tag icon={<FacebookOutlined />} color="#3b5999">
Facebook
</Tag>
<Tag icon={<LinkedinOutlined />} color="#55acee">
LinkedIn
</Tag>
</>,
mountNode,
);
Presets
magentaredvolcanoorangegoldlimegreencyanbluegeekbluepurple
Custom
#f50#2db7f5#87d068#108ee9
import { Tag, Divider } from 'antd';
ReactDOM.render(
<>
<Divider orientation="left">Presets</Divider>
<div>
<Tag color="magenta">magenta</Tag>
<Tag color="red">red</Tag>
<Tag color="volcano">volcano</Tag>
<Tag color="orange">orange</Tag>
<Tag color="gold">gold</Tag>
<Tag color="lime">lime</Tag>
<Tag color="green">green</Tag>
<Tag color="cyan">cyan</Tag>
<Tag color="blue">blue</Tag>
<Tag color="geekblue">geekblue</Tag>
<Tag color="purple">purple</Tag>
</div>
<Divider orientation="left">Custom</Divider>
<div>
<Tag color="#f50">#f50</Tag>
<Tag color="#2db7f5">#2db7f5</Tag>
<Tag color="#87d068">#87d068</Tag>
<Tag color="#108ee9">#108ee9</Tag>
</div>
</>,
mountNode,
);
import { Tag } from 'antd';
const { CheckableTag } = Tag;
const tagsData = ['Movies', 'Books', 'Music', 'Sports'];
class HotTags extends React.Component {
state = {
selectedTags: ['Books'],
};
handleChange(tag, checked) {
const { selectedTags } = this.state;
const nextSelectedTags = checked ? [...selectedTags, tag] : selectedTags.filter(t => t !== tag);
console.log('You are interested in: ', nextSelectedTags);
this.setState({ selectedTags: nextSelectedTags });
}
render() {
const { selectedTags } = this.state;
return (
<>
<span style={{ marginRight: 8 }}>Categories:</span>
{tagsData.map(tag => (
<CheckableTag
key={tag}
checked={selectedTags.indexOf(tag) > -1}
onChange={checked => this.handleChange(tag, checked)}
>
{tag}
</CheckableTag>
))}
</>
);
}
}
ReactDOM.render(<HotTags />, mountNode);
Tag 1Tag 2Tag 3
import { Tag, Input } from 'antd';
import { TweenOneGroup } from 'rc-tween-one';
import { PlusOutlined } from '@ant-design/icons';
class EditableTagGroup extends React.Component {
state = {
tags: ['Tag 1', 'Tag 2', 'Tag 3'],
inputVisible: false,
inputValue: '',
};
handleClose = removedTag => {
const tags = this.state.tags.filter(tag => tag !== removedTag);
console.log(tags);
this.setState({ tags });
};
showInput = () => {
this.setState({ inputVisible: true }, () => this.input.focus());
};
handleInputChange = e => {
this.setState({ inputValue: e.target.value });
};
handleInputConfirm = () => {
const { inputValue } = this.state;
let { tags } = this.state;
if (inputValue && tags.indexOf(inputValue) === -1) {
tags = [...tags, inputValue];
}
console.log(tags);
this.setState({
tags,
inputVisible: false,
inputValue: '',
});
};
saveInputRef = input => {
this.input = input;
};
forMap = tag => {
const tagElem = (
<Tag
closable
onClose={e => {
e.preventDefault();
this.handleClose(tag);
}}
>
{tag}
</Tag>
);
return (
<span key={tag} style={{ display: 'inline-block' }}>
{tagElem}
</span>
);
};
render() {
const { tags, inputVisible, inputValue } = this.state;
const tagChild = tags.map(this.forMap);
return (
<>
<div style={{ marginBottom: 16 }}>
<TweenOneGroup
enter={{
scale: 0.8,
opacity: 0,
type: 'from',
duration: 100,
onComplete: e => {
e.target.style = '';
},
}}
leave={{ opacity: 0, width: 0, scale: 0, duration: 200 }}
appear={false}
>
{tagChild}
</TweenOneGroup>
</div>
{inputVisible && (
<Input
ref={this.saveInputRef}
type="text"
size="small"
style={{ width: 78 }}
value={inputValue}
onChange={this.handleInputChange}
onBlur={this.handleInputConfirm}
onPressEnter={this.handleInputConfirm}
/>
)}
{!inputVisible && (
<Tag onClick={this.showInput} className="site-tag-plus">
<PlusOutlined /> New Tag
</Tag>
)}
</>
);
}
}
ReactDOM.render(<EditableTagGroup />, mountNode);
.site-tag-plus {
background: #fff;
border-style: dashed;
}
Without icon
successprocessingerrorwarningdefaultWith icon
successprocessingerrorwarningwaitingstopimport { Tag } from 'antd';
import {
CheckCircleOutlined,
SyncOutlined,
CloseCircleOutlined,
ExclamationCircleOutlined,
ClockCircleOutlined,
MinusCircleOutlined,
} from '@ant-design/icons';
ReactDOM.render(
<>
<div>
<h4>Without icon</h4>
<Tag color="success">success</Tag>
<Tag color="processing">processing</Tag>
<Tag color="error">error</Tag>
<Tag color="warning">warning</Tag>
<Tag color="default">default</Tag>
</div>
<div>
<h4>With icon</h4>
<Tag icon={<CheckCircleOutlined />} color="success">
success
</Tag>
<Tag icon={<SyncOutlined spin />} color="processing">
processing
</Tag>
<Tag icon={<CloseCircleOutlined />} color="error">
error
</Tag>
<Tag icon={<ExclamationCircleOutlined />} color="warning">
warning
</Tag>
<Tag icon={<ClockCircleOutlined />} color="default">
waiting
</Tag>
<Tag icon={<MinusCircleOutlined />} color="default">
stop
</Tag>
</div>
</>,
mountNode,
);
API#
Tag#
参数 | 说明 | 类型 | 默认值 | 版本 |
---|---|---|---|---|
closable | 标签是否可以关闭 | boolean | false | |
color | 标签色 | string | - | |
closeIcon | 自定义关闭按钮 | ReactNode | - | 4.4.0 |
onClose | 关闭时的回调 | (e) => void | - | |
visible | 是否显示标签 | boolean | true | |
icon | 设置图标 | ReactNode | - |
Tag.CheckableTag#
参数 | 说明 | 类型 | 默认值 |
---|---|---|---|
checked | 设置标签的选中状态 | boolean | false |
onChange | 点击标签时触发的回调 | (checked) => void | - |