javascript - helmet - ¿Cómo debo manejar una animación de licencia en componentWillUnmount en React?
react title (2)
Echa un vistazo a React-Motion
youtube.com/watch?v=1tavDv5hXpo
Cheng Lou es un desarrollador del equipo React.
Él habla sobre los problemas con el actual ReactCSSTransitionGroup.
Ha desarrollado React-Motion para solucionar este problema.
Aunque no utiliza transiciones CSS, parece funcionar bien y es muy determinista. Donde ReactCSSTransitionGroup parece ser quisquilloso ya que no puede interrumpir las transiciones.
Me preguntaba si alguien podría proporcionar alguna información sobre cómo manejan las animaciones de permisos en React.js. He estado usando Greensock TweenMax y las animaciones de entrada funcionan bien en componentDidMount
, pero no he encontrado una manera confiable de animar un componente.
Mi sensación es que debería ir en el componentWillUnmount
WillUnmount, pero React no proporciona ningún mecanismo de devolución de llamada para que usted indique cuándo está listo para soltar un componente. Por lo tanto, la animación de transición nunca se completa, ya que las animaciones son asíncronas a Reaccionar. En cambio, ves una pequeña fracción de segundo de animación, el componente desaparece y es reemplazado por el siguiente componente que se anima.
Este es un problema con el que he luchado desde que comencé a usar React hace 9 meses. No puedo evitar pensar que tiene que haber una solución que no sea ReactCSSTransitionGroup
que me parece engorrosa y delicada, especialmente con el router de reacción.
ReactTransitionGroup
(sobre el cual se construye ReactCSSTransitionGroup
) es el componente base que permite la entrada y salida asincrónica. Proporciona ganchos de ciclo de vida que puede usar para enganchar en animaciones basadas en JS. Los documentos enumeran los ganchos permitidos:
ReactTransitionGroup
es la base de las animaciones. Cuando los niños se agregan o eliminan de forma declarativa (como en el ejemplo anterior) se les solicitan anzuelos especiales de ciclo de vida. Hay 3 formas de comenzar a utilizarReactCSSTransitionGroups
:
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)
Esto se llama al mismo tiempo que
componentDidMount()
para los componentes que se montan inicialmente en unTransitionGroup
. Bloqueará que ocurran otras animaciones hasta que se llame a lacallback
llamada. Solo se invoca en la representación inicial de unTransitionGroup
.
componentDidAppear()
Esto se invoca después de llamar a la función de
callback
que se pasó acomponentWillAppear
.
componentWillEnter(callback)
Esto se llama al mismo tiempo que
componentDidMount()
para componentes agregados a unTransitionGroup
existente. Bloqueará que ocurran otras animaciones hasta que se llame a lacallback
llamada. No se invocará en la representación inicial de unTransitionGroup
.
componentDidEnter()
Esto se invoca después de llamar a la función de
callback
que pasó acomponentWillEnter
.
componentWillLeave(callback)
Esto se llama cuando el niño ha sido eliminado del
ReactTransitionGroup
. Aunque el niño ha sido eliminado,ReactTransitionGroup
lo mantendrá en el DOM hasta que se llame de nuevo.
componentDidLeave()
Se
willLeave
cuando se llama a lawillLeave
callback
willLeave
(al mismo tiempo quecomponentWillUnmount
).
Para animar a un niño, debe comenzar su animación en componentWillLeave
y llamar a la callback
proporcionada cuando la animación esté completa. Como ejemplo, aquí hay un JSFiddle que muestra un componente que escalona-anima a sus hijos dentro y fuera: http://jsfiddle.net/BinaryMuse/f51jbw2k/
El código relevante para animar es:
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);
},