2017-05-04 103 views
2

我试图让组件进入和离开时,该按钮被点击状态之间切换之间的过渡CSSTransitionGroup动画阵营与切换

我也试图把<UserDetails /><UserEdit />作为单独的组件,但具有相同的结果因为没有动画被触发。

https://www.webpackbin.com/bins/-KjIPcMeQF3iriHRqTBW

Hello.js

import CSSTransitionGroup from 'react-transition-group/CSSTransitionGroup' 
import './styles.css' 
export default class Hello extends React.Component { 
constructor() { 
super() 

this.state = { showEdit: false } 
this.handleEdit = this.handleEdit.bind(this) 
} 

handleEdit() { this.setState({ showEdit: !this.state.showEdit }) } 

render() { 

const UserDetails =() => (
<div className="componenta" key="1">UserDetails</div> 
) 
const UserEdit =() => (
<div className="componentb" key="2">UserEdit</div> 
) 

return(
<div > 
    <CSSTransitionGroup 
     transitionName="example" 
     transitionEnterTimeout={10} 
     transitionLeaveTimeout={600}> 
    {this.state.showEdit ? <UserDetails /> : <UserEdit />} 
    </CSSTransitionGroup> 
    <button onClick={this.handleEdit}>Toggle</button> 
</div> 
) 
} 
} 

styles.css的

.thing-enter { 
opacity: 0.01; 
transition: opacity 1s ease-in; 
} 

.thing-enter.thing-enter-active { 
    opacity: 1; 
} 

.thing-leave { 
    opacity: 1; 
    transition: opacity 1s ease-in; 
} 

.thing-leave.thing-leave-active { 
    opacity: 0.01; 
} 

回答

1

你有你的key属性设置为错误的项目 - 该<div>不是直接的后代(因为通过将其定义为函数将其包装到组件中),因此它不知道添加或删除了哪些项目。您必须将您的密钥设置为UserDetailsUserEdit,因此CSSTransitionGroup可以正确确定其子中的更改。

这是你的render方法的工作原理:

render() { 

    const UserDetails =() => (
     <div className="componenta">UserDetails</div> 
    ) 
    const UserEdit =() => (
     <div className="componentb">UserEdit</div> 
    ) 
    return(
    <div > 
     <CSSTransitionGroup 
      transitionName="example" 
      transitionEnterTimeout={10} 
      transitionLeaveTimeout={600}> 
     {this.state.showEdit ? <UserDetails key="1" /> : <UserEdit key="2" />} 
     </CSSTransitionGroup> 
     <button onClick={this.handleEdit}>Toggle</button> 
    </div> 
    ) 
    } 

另一种方法是,以UserDetailsUserEdit存入变量,然后使它们如此。这将允许你离开key属性,而不是移动它们。

+0

感谢现在的解释更有意义,我,我怎么能阻止这两个组件从在同一时间,当显示在他们之间切换?目前它们在转换时出现在彼此之下,但是我希望它在相同位置上淡入/淡出 –

+0

@tomharrison我会用CSS解决这个问题。可以在'.thing-enter'转换中设置一个延迟,或者为元素设置绝对定位,这样它们就可以相互绘制。 – ItsGreg

+0

完美!我已经完全定位了,因为我无法按预期延迟工作,webpack.bin已经通过工作示例进行了更新 –