React Animation 的 ReactCSSTransitionGroup 和 CSSTransitionGroup 不能像示例代码中那样工作

Posted

技术标签:

【中文标题】React Animation 的 ReactCSSTransitionGroup 和 CSSTransitionGroup 不能像示例代码中那样工作【英文标题】:React Animation's ReactCSSTransitionGroup and CSSTransitionGroup cannot work as in the sample code 【发布时间】:2021-07-14 04:24:06 【问题描述】:

我正在尝试 React Animation 的示例代码:

    https://reactjs.org/docs/animation.html https://github.com/reactjs/react-transition-group/tree/v1-stable

演示:

https://codesandbox.io/s/dark-forest-ofzfr?file=/src/App.js

        <CSSTransitionGroup
          transitionName="example"
          transitionEnterTimeout=500
          transitionLeaveTimeout=300
        >
          items
        </CSSTransitionGroup>

它认为App 不存在于index.js 中。但是如果CSSTransitionGroup被一些静态文本替换,那么它就可以工作(没有任何动画效果):

https://codesandbox.io/s/blue-dust-j0y57?file=/src/App.js

ReactCSSTransitionGroup相同:https://codesandbox.io/s/quizzical-franklin-j2hhp?file=/src/App.js

它是如何工作的?

【问题讨论】:

【参考方案1】:

快速回答:截至 2021 年 4 月,React's official animation docs 指向 v1 文档,但如果我们使用当前的 react-transition-group 尝试解决方案,那么它将无法正常工作。原因是从 v2 向前,到当前的 v4 版本,它不向后兼容 v1。

因此,如果我们正在使用或探索使用它,请转到文档并立即跳过与 v1 相关的任何信息。

【讨论】:

【参考方案2】:

您应该使用TransitionGroupCSSTransition 而不是ReactCSSTransitionGroupCSSTransitionGroup 。代码如下所示

import React from "react";
import  TransitionGroup, CSSTransition  from "react-transition-group";

class App extends React.Component 
  constructor(props) 
    super(props);
    this.state =  items: ["hello", "world", "click", "me"] ;
    this.handleAdd = this.handleAdd.bind(this);
  

  handleAdd() 
    const newItems = this.state.items.concat([prompt("Enter some text")]);
    this.setState( items: newItems );
  

  handleRemove(i) 
    let newItems = this.state.items.slice();
    newItems.splice(i, 1);
    this.setState( items: newItems );
  

  render() 
    const items = this.state.items.map((item, i) => (
      <CSSTransition
        key=i
        classNames="example"
        timeout= enter: 500, exit: 300 
      >
        <div key=item onClick=() => this.handleRemove(i)>
          item
        </div>
      </CSSTransition>
    ));

    return (
      <div>
        <button onClick=this.handleAdd>Add Item</button>
        <TransitionGroup
          transitionName="example"
          transitionEnterTimeout=500
          transitionLeaveTimeout=300
        >
          items
        </TransitionGroup>
      </div>
    );
  


export default App;

styles.css

.example-enter 
  opacity: 0.01;


.example-enter.example-enter-active 
  opacity: 1;
  transition: opacity 500ms ease-in;

.example-exit 
  opacity: 1;

.example-exit.example-exit-active 
  opacity: 0.01;
  transition: opacity 300ms ease-in;

您可以在codesandbox 中查看此处,查看此doc 了解有关从 v1 迁移到 v2 的更多信息

【讨论】:

您说“您应该使用 TransitionGroup 和 CSSTransition 而不是 ReactCSSTransitionGroup 和 CSSTransitionGroup”,但这是为什么呢?示例代码中不就是这样吗?不知何故,我觉得这是编程的新时代:这样做,它会奏效,但为什么以及如何——不知道...... 文档说“CSSTransitionGroup 是一个基于 TransitionGroup 的高级 API,当 React 组件进入或离开 DOM 时,它是一种执行 CSS 过渡和动画的简单方法”,而你是说不要t 使用 CSSTransitionGroup 但使用 TransitionGroup 你有没有注意到,如果你点击第二个或第三个词删除它,淡出的词是最后一个?

以上是关于React Animation 的 ReactCSSTransitionGroup 和 CSSTransitionGroup 不能像示例代码中那样工作的主要内容,如果未能解决你的问题,请参考以下文章

React-Router 动画 Animation

React Router + Animation 库问题:组件在使用 react-router-dom 卸载之前不会动画

不支持 React-native Animation.event 样式属性

React Animation 的 ReactCSSTransitionGroup 和 CSSTransitionGroup 不能像示例代码中那样工作

在React中写一个Animation组件,为组件进入和离开加上动画/过度

react 拖拽排序