React 动态添加动画反向类

Posted

技术标签:

【中文标题】React 动态添加动画反向类【英文标题】:React dynamically adding classes for animation reverse 【发布时间】:2018-04-05 05:10:00 【问题描述】:

完整代码:https://codesandbox.io/s/j4r7yoollw 我在按钮单击时为模态设置动画。但是当我关闭它时,我希望能够在components/Modal/index.css 中反转动画。我实现了setTimeout 让模态时间淡出,但它不起作用。我该怎么做才能让它发挥作用?

模态/index.js:

import React from 'react';
import Question from './Question';
import Loading from './Loading';
import Success from './Success';
import './index.css';

class Modal extends React.Component 
  constructor(props) 
    super(props);

    this.state = 
      loading: false,
      success: false,
      reverse: false,
    ;
  
  removeUser = () => 
    this.setState( loading: true );
    // simulate async loading action
    setTimeout(
      () =>
        this.setState(
          loading: false,
          success: true,
        ),
      2000,
    );
    //simulate promise (function above then this below)
    setTimeout(() => this.props.removeUser(this.props.data), 2001);
  ;
  closeModal = () => 
    this.setState( reverse: true );
    setTimeout(() => 
      this.props.closeModal();
      this.setState(
        reverse: false,
        success: false,
      );
    , 3000);
  ;
  render() 
    const  id, name  = this.props.data;
    const  loading, success  = this.state;
    // The gray background
    const backdropStyle = 
      position: 'fixed',
      top: 0,
      bottom: 0,
      left: 0,
      right: 0,
      backgroundColor: 'rgba(0,0,0,0.3)',
      padding: 50,
    ;

    // The modal "window"
    const modalStyle = 
      backgroundColor: '#fff',
      textAlign: 'center',
      borderRadius: 3,
      maxWidth: 360,
      minHeight: 130,
      margin: '0 auto',
    ;

    if (this.props.displayModal) 
      return (
        <div className='backdrop ' + (this.state.reverse ? 'reverse' : '') style=backdropStyle>
          <div className='modal ' + (this.state.reverse ? 'reverse' : '') style=modalStyle>
            !loading &&
              !success && (
                <Question
                  id=id
                  name=name
                  removeUser=this.removeUser
                  closeModal=this.closeModal
                />
              )
            loading && !success && <Loading />
            !loading && success && <Success closeModal=this.closeModal />
          </div>
        </div>
      );
    
    return null;
  


export default Modal;

模态/index.css:

@keyframes modalFade 
  from 
    transform: translateY(-50%);
    opacity: 0;
  
  to 
    transform: translateY(0);
    opacity: 1;
  


.modal 
  animation-name: modalFade;
  animation-duration: 0.3s;


@keyframes backdropFade 
  from 
    opacity: 0;
  
  to 
    opacity: 1;
  


.backdrop 
  animation-name: backdropFade;
  animation-duration: 0.3s;


.reverse 
  animation-direction: reverse;

【问题讨论】:

请提供问题内的代码 @artgb 完成,codesandbox 中的完整代码 刚刚在 Devtools 中注意到“reverse”被添加到 className,所以我想知道是不是 CSS 需要工作?我也在学习。 @anand 是的,我认为当我使用 animation-direction: reverse 添加类时,css 动画不会再次启动 【参考方案1】:

我对您的代码进行了一些更改,据我测试,它运行良好。

在 css 文件中,我为反向模式添加了一个新动画,以确保取消其他正常方向的动画。 我还添加了animation-fill-mode: forwards; 属性以保持动画在最后一帧冻结。

在 jsx 文件中,我将超时时间从 3000 更改为 300ms,以匹配动画持续时间 0.3s。

我已经在https://codesandbox.io/s/5wlooq88xl 与您进行了更正。

closeModal = () => 
    this.setState( reverse: true );
    setTimeout(() => 
      this.props.closeModal();
      this.setState(
        reverse: false,
        success: false,
      );
    , 300);
  ;
@keyframes modalFade 
  from 
    transform: translateY(-50%);
    opacity: 0;
  
  to 
    transform: translateY(0);
    opacity: 1;
  


@keyframes modalFadeReverse 
  from 
    transform: translateY(0);
    opacity: 1;
  
  to 
    transform: translateY(-50%);
    opacity: 0;
  


.modal 
  animation-name: modalFade;
  animation-duration: 0.3s;
  animation-fill-mode: forwards;

.modal.reverse 
  animation-name: modalFadeReverse;


@keyframes backdropFade 
  from 
    opacity: 0;
  
  to 
    opacity: 1;
  


@keyframes backdropFadeReverse 
  from 
    opacity: 1;
  
  to 
    opacity: 0;
  


.backdrop 
  animation-name: backdropFade;
  animation-duration: 0.3s;
  animation-fill-mode: forwards;

.backdrop.reverse 
  animation-name: backdropFadeReverse;

【讨论】:

是的!正是我想要的!谢谢!

以上是关于React 动态添加动画反向类的主要内容,如果未能解决你的问题,请参考以下文章

如何使用classnames模块库为react动态添加class类样式

react 对象动态添加属性 setState

将动态文本动画添加到 nivo 滑块

Unity动画系统Animator动态添加事件

如何动态地将动画添加到队列中

(ag-grid)动画动态添加的列