我很难让动画在React中工作。也许有一些我从根本上缺失的东西。
我在coffeescript中这样做 - 我希望你不介意。
我创建了一个非常简单的UI。这是一个带有标题的div。单击标题时,标题会更改,我想使用VelocityJS为淡入/淡出过渡设置动画。
ReactTransitionGroup = React.createFactory(React.addons.CSSTransitionGroup)
{div} = React.DOM
TitleClass = React.createClass
displayName: "Title"
render: ->
(div {onClick:@props.changeTitle}, @props.title)
componentWillEnter: (done) ->
node = @getDOMNode()
console.log "willEnter"
Velocity(node, 'transition.fadeIn', {complete: done})
componentWillLeave: (done) ->
node = @getDOMNode()
console.log "willLeave"
Velocity(node, 'transition.fadeOut', {complete: done})
Title = React.createFactory(TitleClass)
MainClass = React.createClass
displayName: "Main"
getInitialState: ->
title: 'Main'
changeTitle: ->
if @state.title is 'Home'
@setState {title: 'Main'}
else
@setState {title: 'Home'}
render: ->
(div {style:{width: '100%', fontSize:'25px', textAlign:'center', marginTop:'20px'}},
(ReactTransitionGroup {transitionName: 'fade'},
(Title {changeTitle:@changeTitle, title:@state.title})
)
)
Main = React.createFactory(MainClass)
React.render(Main({}), document.body)
就这样吧。非常自我解释。这个ReactTransitionGroup
对我来说仍然是一个谜。我的理解是,它的任何一个孩子都应该接到componentWillEnter
和componentWillLeave
的电话,但这并不会最终发生。 According to the docs似乎我应该看到console.log "willEnter"
,但我不会。
我已经挂了好几个小时了。有什么想法吗?
答案 0 :(得分:2)
我可以在上面的代码中看到两个问题。
第一个是您使用的是React.addons.CSSTransitionGroup
而不是React.addons.TransitionGroup
。
第二个问题是,当实际componentWillEnter
是被触发的方法时,您希望componentWillAppear
在挂载时被触发。
答案 1 :(得分:0)
CSSTransitionGroup监视写入元素的CSS transition
属性的实际用途。我不确定究竟是怎么回事,但听起来Velocity并没有像CSSTransitionGroup那样开展工作。您可能需要手动拨打componentWillEnter
和componentWillLeave
。在这种情况下,听起来并不难。
编辑:哎呀,我错过了您在组中的子组件上没有key
个属性。据我所知,componentWillEnter
和componentWillLeave
应该被调用,无论其他什么,如果你得到那些孩子的钥匙。
答案 2 :(得分:0)
解决方案最终要使用React.addons.TransitionGroup
。 CSSTransitionGroup
只是一个包含CSS内容的包装器。
另一个问题是,要获得动画回调,孩子们必须有一把钥匙!
ReactTransitionGroup = React.createFactory(React.addons.TransitionGroup)
# {clip}
(ReactTransitionGroup {transitionName: 'fade'},
(Title {changeTitle:@changeTitle, title:@state.title, key:'title'})
)