Movies
`;
+exports[`Tag visibility can be controlled by visible with hidden as initial value 1`] = `
+
+`;
exports[`Tag visibility can be controlled by visible with hidden as initial value 2`] = `
`;
-exports[`Tag visibility can be controlled by visible with hidden as initial value 3`] = `
`;
+exports[`Tag visibility can be controlled by visible with hidden as initial value 3`] = `
+
+`;
exports[`Tag visibility can be controlled by visible with visible as initial value 1`] = `
`;
-exports[`Tag visibility can be controlled by visible with visible as initial value 2`] = `
`;
+exports[`Tag visibility can be controlled by visible with visible as initial value 2`] = `
+
+`;
exports[`Tag visibility can be controlled by visible with visible as initial value 3`] = `
`;
diff --git a/components/tag/__tests__/index.test.js b/components/tag/__tests__/index.test.js
index 2bfbe2fffc..02067cb2b0 100644
--- a/components/tag/__tests__/index.test.js
+++ b/components/tag/__tests__/index.test.js
@@ -15,12 +15,12 @@ describe('Tag', () => {
const onClose = jest.fn();
const wrapper = mount(
);
expect(wrapper.find('.anticon-close').length).toBe(1);
- expect(wrapper.find('.ant-tag').length).toBe(1);
+ expect(wrapper.find('div.ant-tag:not(.ant-tag-hidden)').length).toBe(1);
wrapper.find('.anticon-close').simulate('click');
expect(onClose).toBeCalled();
jest.runAllTimers();
wrapper.update();
- expect(wrapper.find('.ant-tag').length).toBe(0);
+ expect(wrapper.find('div.ant-tag:not(.ant-tag-hidden)').length).toBe(0);
});
it('should not be closed when prevent default', () => {
@@ -29,10 +29,10 @@ describe('Tag', () => {
};
const wrapper = mount(
);
expect(wrapper.find('.anticon-close').length).toBe(1);
- expect(wrapper.find('.ant-tag').length).toBe(1);
+ expect(wrapper.find('div.ant-tag:not(.ant-tag-hidden)').length).toBe(1);
wrapper.find('.anticon-close').simulate('click');
jest.runAllTimers();
- expect(wrapper.find('.ant-tag').length).toBe(1);
+ expect(wrapper.find('div.ant-tag:not(.ant-tag-hidden)').length).toBe(1);
});
describe('visibility', () => {
diff --git a/components/tag/index.tsx b/components/tag/index.tsx
index be987f029e..e356c5ba25 100644
--- a/components/tag/index.tsx
+++ b/components/tag/index.tsx
@@ -1,5 +1,4 @@
import * as React from 'react';
-import * as ReactDOM from 'react-dom';
import Animate from 'rc-animate';
import classNames from 'classnames';
import omit from 'omit.js';
@@ -14,23 +13,26 @@ export interface TagProps extends React.HTMLAttributes
{
prefixCls?: string;
className?: string;
color?: string;
- /** 标签是否可以关闭 */
closable?: boolean;
visible?: boolean;
- /** 关闭时的回调 */
onClose?: Function;
- /** 动画关闭后的回调 */
afterClose?: Function;
style?: React.CSSProperties;
}
-export interface TagState {
- closing: boolean;
- closed: boolean;
+interface TagState {
visible: boolean;
- mounted: boolean;
}
+interface InnterTagProps extends TagProps {
+ show: boolean;
+}
+
+const InnerTag = ({ show, ...restProps }: InnterTagProps) => {
+ const divProps = omit(restProps, ['onClose', 'afterClose', 'color', 'visible', 'closable']);
+ return ;
+};
+
class Tag extends React.Component {
static CheckableTag = CheckableTag;
static defaultProps = {
@@ -38,84 +40,40 @@ class Tag extends React.Component {
closable: false,
};
- static getDerivedStateFromProps(nextProps: TagProps, state: TagState) {
+ static getDerivedStateFromProps(nextProps: TagProps) {
if ('visible' in nextProps) {
- let newState: Partial = {
+ return {
visible: nextProps.visible,
- mounted: true,
};
-
- if (!state.mounted) {
- newState = {
- ...newState,
- closed: !nextProps.visible,
- };
- }
- return newState;
}
return null;
}
state = {
- closing: false,
- closed: false,
visible: true,
- mounted: false,
};
- componentDidUpdate(_prevProps: TagProps, prevState: TagState) {
- if (prevState.visible && !this.state.visible) {
- this.close();
- } else if (!prevState.visible && this.state.visible) {
- this.show();
- }
- }
-
- handleIconClick = (e: React.MouseEvent) => {
- const onClose = this.props.onClose;
+ setVisible(visible: boolean, e: React.MouseEvent) {
+ const { onClose } = this.props;
if (onClose) {
onClose(e);
}
- if (e.defaultPrevented || 'visible' in this.props) {
+ if (e.defaultPrevented) {
return;
}
- this.setState({ visible: false });
- };
-
- close = () => {
- if (this.state.closing || this.state.closed) {
- return;
+ if (!('visible' in this.props)) {
+ this.setState({ visible });
}
- const dom = ReactDOM.findDOMNode(this) as HTMLElement;
- dom.style.width = `${dom.getBoundingClientRect().width}px`;
- // It's Magic Code, don't know why
- dom.style.width = `${dom.getBoundingClientRect().width}px`;
- this.setState({
- closing: true,
- });
- };
+ }
- show = () => {
- this.setState({
- closed: false,
- });
+ handleIconClick = (e: React.MouseEvent) => {
+ this.setVisible(false, e);
};
- animationEnd = (_: string, existed: boolean) => {
- if (!existed && !this.state.closed) {
- this.setState({
- closed: true,
- closing: false,
- });
-
- const afterClose = this.props.afterClose;
- if (afterClose) {
- afterClose();
- }
- } else {
- this.setState({
- closed: false,
- });
+ animationEnd = () => {
+ const { afterClose } = this.props;
+ if (afterClose) {
+ afterClose();
}
};
@@ -128,44 +86,55 @@ class Tag extends React.Component {
);
}
- render() {
- const { prefixCls, closable, color, className, children, style, ...otherProps } = this.props;
- const closeIcon = closable ? : '';
+ getTagStyle() {
+ const { color, style } = this.props;
const isPresetColor = this.isPresetColor(color);
- const classString = classNames(
+ return {
+ backgroundColor: color && !isPresetColor ? color : undefined,
+ ...style,
+ };
+ }
+
+ getTagClassName() {
+ const { prefixCls, className, color } = this.props;
+ const { visible } = this.state;
+ const isPresetColor = this.isPresetColor(color);
+ return classNames(
prefixCls,
{
[`${prefixCls}-${color}`]: isPresetColor,
[`${prefixCls}-has-color`]: color && !isPresetColor,
- [`${prefixCls}-close`]: this.state.closing,
+ [`${prefixCls}-hidden`]: !visible,
},
className,
);
- // fix https://fb.me/react-unknown-prop
- const divProps = omit(otherProps, ['onClose', 'afterClose', 'visible']);
- const tagStyle = {
- backgroundColor: color && !isPresetColor ? color : null,
- ...style,
- };
- const tag = this.state.closed ? (
-
- ) : (
-
- {children}
- {closeIcon}
-
- );
+ }
+ renderCloseIcon() {
+ const { closable } = this.props;
+ return closable ? : null;
+ }
+
+ render() {
+ const { prefixCls, children, ...otherProps } = this.props;
+ const { visible } = this.state;
return (
- {tag}
+
+ {children}
+ {this.renderCloseIcon()}
+
);
diff --git a/components/tag/style/index.less b/components/tag/style/index.less
index 3a1d926892..ae23f3ee9c 100644
--- a/components/tag/style/index.less
+++ b/components/tag/style/index.less
@@ -94,6 +94,10 @@
animation-fill-mode: both;
}
+ &-hidden {
+ display: none;
+ }
+
@colors: pink, magenta, red, volcano, orange, yellow, gold, cyan, lime, green, blue, geekblue,
purple;