这么简单的事情应该很容易完成,但我却为它的复杂程度而苦恼。
我只想为 React 组件的安装和卸载制作动画,仅此而已。以下是我到目前为止尝试过的方法以及每个解决方案不起作用的原因:
ReactCSSTransitionGroup
ReactTransitionGroup
TransitionMotion
left: -10000px
我想要一个易于实现的东西。安装时,为一组样式设置动画;卸载时,为相同(或另一组)样式设置动画。完成。它还必须在多个平台上具有高性能。
我在这里遇到了难题。如果我遗漏了什么,并且有简单的方法可以解决此问题,请告诉我。
这有点冗长,但我已经使用了所有本机事件和方法来实现此动画。没有ReactCSSTransitionGroup,ReactTransitionGroup等等。
我使用过的东西
onTransitionEnd
工作原理
mounted
opacity: 0
componentDidMount
componentWillReceiveProps
opacity: 1
继续循环。
看一下代码,你就会明白。如果需要任何说明,请发表评论。
class App extends React.Component{ constructor(props) { super(props) this.transitionEnd = this.transitionEnd.bind(this) this.mountStyle = this.mountStyle.bind(this) this.unMountStyle = this.unMountStyle.bind(this) this.state ={ //base css show: true, style :{ fontSize: 60, opacity: 0, transition: 'all 2s ease', } } } componentWillReceiveProps(newProps) { // check for the mounted props if(!newProps.mounted) return this.unMountStyle() // call outro animation when mounted prop is false this.setState({ // remount the node when the mounted prop is true show: true }) setTimeout(this.mountStyle, 10) // call the into animation } unMountStyle() { // css for unmount animation this.setState({ style: { fontSize: 60, opacity: 0, transition: 'all 1s ease', } }) } mountStyle() { // css for mount animation this.setState({ style: { fontSize: 60, opacity: 1, transition: 'all 1s ease', } }) } componentDidMount(){ setTimeout(this.mountStyle, 10) // call the into animation } transitionEnd(){ if(!this.props.mounted){ // remove the node on transition end when the mounted prop is false this.setState({ show: false }) } } render() { return this.state.show && <h1 style={this.state.style} onTransitionEnd={this.transitionEnd}>Hello</h1> } } class Parent extends React.Component{ constructor(props){ super(props) this.buttonClick = this.buttonClick.bind(this) this.state = { showChild: true, } } buttonClick(){ this.setState({ showChild: !this.state.showChild }) } render(){ return <div> <App onTransitionEnd={this.transitionEnd} mounted={this.state.showChild}/> <button onClick={this.buttonClick}>{this.state.showChild ? 'Unmount': 'Mount'}</button> </div> } } ReactDOM.render(<Parent />, document.getElementById('app')) <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.3.2/react-with-addons.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <div id="app"></div>