Marco illustrddMMMM Aj portfólioFMMMMM TrauseFMMMMMM DaHMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM

Je dois seulement utiliser les animations jQuery, ne mentionnez pas les transitions.

NE MarcoAeaeaeaeaeaeaeateageaeaeaeaeaquidenceAeaFapsAeaeaaneaFacheaaneaFacheaaneaFeaFacheaeaeaFacheaeaFeaeaFacheaaneaFacheaaneaFacheaaneaFea DaFufeanAeaFineAea

var CommentForm = React.createClass({ componentWillUnmount: function(cb) { console.log('hiding') jQuery(this.getDOMNode()).slideUp('slow', cb); console.log((this.getDOMNode())) }, componentDidMount: function() { jQuery(this.getDOMNode()).hide().slideDown('slow'); if (this.props.autofocus) { jQuery(this.refs.commentArea.getDOMNode()).focus(); } }, render: function() { return ( <div> <div className="panel-footer" ref="commentComponent"> <form role="form"> <div className="form-group"> <textarea className="form-control" placeholder="Say something nice!" ref="commentArea"></textarea> </div> <div className="pull-right"> <button className="btn btn-default btn-md" type="button"><span className="fa fa-comment"></span> Comment</button> </div> <div className="clearfix"></div> </form> </div> </div> ); } }); 

Donc, comme vous pouvez le voir, je pourrais ajouter une animation géniale lorsque le composant est monté, mais je ne peux pas démonter le composant avec l'animation comme je l'ai mentionné sur le code.

Des pensées comment faire cela avec jQuery? Et le cycle de vie des composants Reactjs?

Voici ma tentative de résoudre ce problème en utilisant une démonstration trop simpliste.

JsFiddle .

JavaScript:

 var Container = React.createClass({ onClicked: function() { console.log('Container.onClicked'); if(this.state.isShowing){ this.refs.myHelloWorld.hide(); } else { this.setState({ isShowing: true }); } }, onAnimationComplete: function() { console.log('Container.onAnimationComplete'); this.setState({ isShowing: false }); }, getInitialState: function() { return { isShowing: false }; }, render: function() { var helloWorld = this.state.isShowing ? <Hello name="World!" onComplete={this.onAnimationComplete} ref="myHelloWorld" /> : ''; return ( <div id="container"> <MyButton onButtonClicked={this.onClicked}/> {helloWorld} </div> ); } }); var MyButton = React.createClass({ render: function() { return <button onClick={this.props.onButtonClicked}>Toggle</button>; } }); var Hello = React.createClass({ hide: function() { console.log('Hello.hide'); var that = this; $(React.findDOMNode(this)).stop(true).fadeOut({ duration: 1200, complete: function() { that.props.onComplete(); } }); }, componentDidMount: function() { console.log('Hello.componentDidMount'); $(React.findDOMNode(this)).stop(true).hide().fadeIn(1200); }, componentWillUnmount: function() { console.log('Hello.componentWillUnmount'); }, render: function() { return <div>Hello { this.props.name }</div>; } }); React.render(<Container />, document.body); 

Comme vous l'avez compris, il n'est pas très difficile d'animer n'importe quel composant enfant dans la vue principale en utilisant l'événement du cycle de vie componentDidMount .

Cependant, il est délicat de faire de même lorsque nous voulons animer notre composant enfant à partir de notre vue principale, car l'événement de cycle de vie componentWillUnmount correspondant se déclenche après que notre vue n'a pas été montée et qu'il n'y a pas d'événement disponible que nous pourrions utiliser avant cette. Et même s'il y avait, nous aurions alors dû supprimer manuellement notre composant enfant soit de lui-même, soit de la vue principale. J'ai d'abord pensé à utiliser React.unmountComponentAtNode pour faire exactement la même chose, mais j'ai compris d'une autre manière.

La solution consiste à envoyer d'abord un rappel de la vue principale au composant enfant en tant que paramètre qui serait utilisé plus tard. Nous appelons ensuite une autre méthode de composant enfant qui animerait le noeud DOM du composant lui-même. Et enfin, lorsque l'animation est terminée, nous déclencherons le même rappel que nous avons reçu précédemment.

J'espère que cela t'aides.

PS Cette approche n'est pas étroitement liée par jQuery's animate() et les méthodes connexes, mais cette approche peut être utilisée pour toutes les autres bibliothèques d'animation basées sur JS (je regarde mon GSAP préféré)), tant qu'ils déclenchent un rappel Lorsque l'animation est terminée (et GSAP en fait une pléthore ).

Mise à jour # 1:

Wah wah vee va!

Donc, à ce moment-là, je creusais davantage ReactJS et surtout ses parties d'animation et je regardais ce que je trouvais, elles ont exposé une API de bas niveau pour les événements de transition .

Donc, cette chose que nous essayions d'accomplir plus tôt avec nos propres rappels, et notre objet de props , en maintenant une référence à etc., il s'avère que cela peut être fait en utilisant cette API elle-même.

Je ne sais pas vraiment si j'aime beaucoup ce moment parce que je ne suis pas parvenu à mettre en œuvre ces deux techniques dans un projet réel, mais je suis heureux que nous ayons maintenant des options disponibles. Nous pouvons utiliser l'API interne, ou nous pouvons cuisiner notre propre solution comme proposé précédemment.

Jetez un oeil à ce jsFiddle modifié en faisant la même chose, mais cette fois en utilisant les rappels internes tels que componentWillEnter et componentWillLeave .