仅在初始渲染后反应 CSS 动画

Posted

技术标签:

【中文标题】仅在初始渲染后反应 CSS 动画【英文标题】:React CSS animations only after initial render 【发布时间】:2015-06-17 08:47:13 【问题描述】:

我正在构建一个 React 应用程序,可以在其中将 Person 添加到 ScheduleCell。添加 Person 后,他可以确认或拒绝他的存在,这将触发 CSS 动画,向正在观看 Schedule 的人显示刚刚发生的事情。

一切都很好,除了当我第一次加载计划时,如果每个人已经确认或拒绝了提案,他就会被动画化。

因为一张图片胜过千言万语,这就是我的问题:

有没有办法可以检测到 Person 刚刚第一次渲染,所以我不添加触发 CSS 动画的 CSS 类,并且能够在下次添加该类?

这里有一些(咖啡)代码更清楚:

Person = React.createClass
  render: ->
    confirmation = @props.person.confirmation
    className = 'alert '
    if confirmation == undefined
      className += 'neutral'
    else if confirmation == true
      className += 'good '
      className += 'hvr-wobble-vertical' if @animate
    else if confirmation == false
      className += 'bad  '
      className += 'hvr-wobble-horizontal' if @animate
    <div className=className
      @props.person.username
    </div>

我想要的是 @animate 在组件第一次渲染时返回 false(在页面加载时),然后在渲染后一直返回 true。

我试过这样做,但它似乎不起作用:

getInitialState: ->
   mounted: false 
componentDidMount: ->
  @setState  mounted: true 
animate: ->
  @state.mounted

感谢您的宝贵时间,

干杯!

【问题讨论】:

【参考方案1】:

您可以收听componentWillReceiveProps(nextProps),将@props.person.confirmationnextProps.person.confirmation 进行比较,并在@state 中设置一个标志以指示组件应该摆动。

componentWillReceiveProps: (nextProps) ->
  if nextProps.person.confirmation != @props.person.confirmation
    @setState
      wobble: if nextProps.person.confirmation then 'vertical' else 'horizontal'

【讨论】:

太棒了!非常聪明,比我预期的要好,而且很有意义。我还学到了一些新的东西,可以解锁新的重构。谢谢楼主!

以上是关于仅在初始渲染后反应 CSS 动画的主要内容,如果未能解决你的问题,请参考以下文章

仅在重新渲染组件时才反应状态更新

ReactJS - 使用反应钩子防止模态的初始动画

Safari 12 css 动画效果不佳

为啥我的反应组件在初始加载时渲染两次?

反应元素宽度动画

css3动画问题字体渲染