我正在使用React,并且我正在尝试创建一个带有React-transition-group的Fade
组件,以便根据状态中存储的条件淡入和淡出一个元素:{{3} }
这就是我现在拥有的:
import React from "react";
import ReactDOM from "react-dom";
import { CSSTransition } from "react-transition-group";
import "./styles.css";
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
mounted: false
};
}
componentDidMount() {
setTimeout(() => {
this.setState({
mounted: true
});
}, 10);
}
render() {
return (
<div className="root">
<CSSTransition
in={this.state.mounted}
appear={true}
unmountOnExit
classNames="fade"
timeout={1000}
>
{this.state.mounted ? (
<div>
<button
onClick={() => {
this.setState({
mounted: !this.state.mounted
});
}}
>
Remove
</button>
<div>COMPONENT</div>
</div>
) : (
<div />
)}
</CSSTransition>
</div>
);
}
}
这是CSS
.fade-enter {
opacity: 0;
transition: opacity .5s ease;
}
.fade-enter-active {
opacity: 1;
transition: opacity .5s ease;
}
.fade-exit {
opacity: 1;
transition: opacity .5s ease;
}
.fade-exit-active {
opacity: 0;
transition: opacity .5s ease;
}
安装组件时,不透明度从0到1的过渡时间为0.5s。但是,当其卸载时,它没有动画效果:该组件消失而没有过渡。
我使用此组件制作了一个沙盒进行测试:http://reactcommunity.org/react-transition-group/css-transition/ 我敢肯定这是很常见的情况,但是我找不到一种方法来对卸载的组件进行动画处理。如果有人有任何想法,将非常欢迎!
-编辑- 正如@IPutuYogaPermana所说,CSSTransition内部的条件渲染不是必需的。所以这个:
{this.state.mounted ? (
<div>
<button
onClick={() => {
this.setState({
mounted: !this.state.mounted
});
}}
>
Remove
</button>
<div>COMPONENT</div>
</div>
) : (
<div />
)}
应该是这样的:
<div>
<button
onClick={() => {
this.setState({
mounted: !this.state.mounted
});
}}
>
Remove
</button>
<div>COMPONENT</div>
</div>
该组件将根据CSSTransition组件中的in
属性自动安装或卸载。
这是codesandbox中的最终代码:https://codesandbox.io/s/k027m33y23
答案 0 :(得分:1)
可以预料,因为随着状态的改变,动画尚未开始,但是子代已经消失了。
所以这就像神奇的瞬间消失了一样。好吧,我们只需要隐藏它吧?删除条件渲染。
我检查了,动画完成后,该节点会自动删除。因此,无需使用条件渲染。幸运的是!代码变为:
import React from "react";
import ReactDOM from "react-dom";
import { CSSTransition } from "react-transition-group";
import "./styles.css";
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
logoIntro: true,
mounted: false
};
}
componentDidMount() {
this.setState({
mounted: true
});
}
render() {
return (
<div className="root">
<CSSTransition
in={this.state.mounted}
appear={true}
unmountOnExit
classNames="fade"
timeout={1000}
>
<div>
<button
onClick={() => {
this.setState({
mounted: !this.state.mounted
});
}}
>
Remove
</button>
<div>SOME COMPONENT</div>
</div>
</CSSTransition>
</div>
);
}
}
ReactDOM.render(<Example />, document.getElementById("root"));