当前位置: 首页 > 面试题库 >

我该如何处理React中componentWillUnmount中的假动画?

邴俊民
2023-03-14
问题内容

我想知道是否有人可以提供一些有关他们如何在React.js中处理假动画的见解。我一直在使用Greensock
TweenMax,并且enter动画在上可以正常工作componentDidMount,但是我还没有找到一种可靠的方法来对组件进行动画处理。

我的感觉是它应该进入componentWillUnmount,但是React没有提供回调机制来指示您何时准备释放组件。因此过渡动画永远不会完成,因为这些动画与React是异步的。取而代之的是,您只看到一秒钟的动画,该组件便消失了,并被动画中的下一个组件所替代。

自从我9个月前开始使用React以来,这个问题一直困扰着我。我忍不住想,除了ReactCSSTransitionGroup我觉得麻烦而棘手的问题之外,还必须有一个解决方案,尤其是对于React-
Router。


问题答案:

ReactTransitionGroup(在ReactCSSTransitionGroup构建时)是允许异步进入和离开的基本组件。它提供了生命周期挂钩,可用于挂钩基于JS的动画。该文档列出了允许的钩子:

ReactTransitionGroup是动画的基础。当声明性地添加或删除子项时(如上述示例),将在其上调用特殊的生命周期挂钩。有3种入门方法ReactCSSTransitionGroups

import ReactCSSTransitionGroup from 'react-addons-css-transition-group' // ES6
var ReactCSSTransitionGroup = require('react-addons-css-transition-group') // ES5 with npm
var ReactCSSTransitionGroup = React.addons.CSSTransitionGroup; // ES5 with react-with-addons.js

componentWillAppear(callback)

componentDidMount()最初安装在中的组件同时调用TransitionGroup。它将阻止其他动画的发生直到callback被调用。它仅在的初始呈现时调用TransitionGroup

componentDidAppear()

在调用callback传递给该函数的函数之后,将调用此函数componentWillAppear

componentWillEnter(callback)

componentDidMount()添加到现有组件中的组件同时调用TransitionGroup。它将阻止其他动画的发生直到callback被调用。在的初始渲染时不会调用它TransitionGroup

componentDidEnter()

在调用callback传递给该函数的函数之后,将调用此函数componentWillEnter

componentWillLeave(callback)

将孩子从中移除后,就会调用此方法ReactTransitionGroup。尽管该子项已被删除,但ReactTransitionGroup将其保留在DOM中直到callback被调用为止。

componentDidLeave()

在调用时willLeave callback(与同时componentWillUnmount)调用。

动画-低级API

为了使孩子动起来,您需要开始动画componentWillLeavecallback在动画完成后调用提供的动画。例如,下面是一个JSFiddle,它显示了一个将其子级交错动画的组件:http
:
//jsfiddle.net/BinaryMuse/f51jbw2k/

动画的相关代码为:

componentWillLeave: function(callback) {
  this._animateOut(callback);
},

_animateOut(callback) {
  var el = ReactDOM.findDOMNode(this);
  setTimeout(function() {
    TweenLite.to(el, 1, {opacity: 0}).play().eventCallback("onComplete", callback);
  }, this.props.animateOutDelay);
},


 类似资料:
  • 问题内容: 我正在学习MySQL并尝试使用子句。当我如下使用它时: 我收到以下错误: MySQL服务器正在使用–secure-file-priv选项运行,因此它无法执行此语句 我该如何解决这个错误? 我已经检查了关于同一错误消息的另一个问题,但仍然找不到解决方案。 我正在使用MySQL 5.6 问题答案: 它按预期工作。您的MySQL服务器已使用--secure-file- priv 选项启动,该

  • 在React中处理滚动位置的正确方法是什么?我真的很喜欢平滑滚动,因为更好的用户体验。因为在React中操作DOM是一个反模式,所以我遇到了一个问题:如何平滑地滚动到某个位置/元素?我通常会更改元素的scrollTop值,但这是对DOM的操作,这是不允许的。 杰斯宾 代码: 如何以反应的方式实现这一点?

  • 问题内容: 我有一种算法,当前会分配很大的双精度数组,它会经常更新和搜索。数组的大小为N ^ 2/2,其中N是算法在其上进行操作的行数。为了与算法周围的应用程序相关联,我还必须保留整个内容的副本。 当然,这对我的算法可以处理的行数施加了限制,因为我要应对堆的限制。到现在为止,我还没有要求使用该算法的人员更新- Xmx设置以分配更多的空间,并且效果很好。但是,我现在遇到了一个真正的问题,我需要此数组

  • 你和我都想去听音乐会,但只剩下一张票了。我们都试图同时预订那张票。使用AWS SDK for PHP的PHP脚本运行以下updateItem API调用,该调用试图将“票据”的“状态”从0(可用)更改为1(保持)。 对于这个用例,这是正确的方法吗? 有人看过DynamoDB文档吗? 如果这是一个正确的实现,对测试方案有什么建议吗?

  • 问题内容: 我有一个表格,希望能够显示“从Y到X排名”的数据。特别是,我希望能够以一种相对有效的方式(即不选择表中的每一行)来显示单个行的数据。排名本身很简单,它是对表中单列的直接ORDER BY。 在这方面,Postgres似乎提出了一些独特的挑战。AFAICT它没有RANK或ROW_NUMBER或同等功能(至少在8.3中,我暂时停留在此位置)。邮件列表档案中的规范答案似乎是创建一个临时序列并从

  • 问题内容: 我想派生一个go进程并获取新进程的ID,但是我在或库中看到的只是启动一个新进程。 问题答案: 您应该从包装中获取。 请注意,这是在根本不使用任何线程的情况下发明的,并且一个进程中始终只有一个执行线程,因此分叉是安全的。使用Go,情况完全不同,因为它大量使用OS级线程来为其goroutine调度提供动力。 现在,在Linux上未经修饰的子进程将在所有活动线程中只有一个线程(在父进程中调用