Comment utiliser React TransitionMotion willEnter ()

À l'aide de TransitionMotion de React Motion , je veux animer 1 ou plusieurs boîtes à l'intérieur et à l'extérieur. Lorsqu'une boîte entre dans la vue, sa largeur et sa hauteur devraient passer de 0 pixels à 200 pixels et son opacité devrait aller de 0 à 1. Lorsque la case sort de la vue, l'inverse devrait se produire (largeur / hauteur = 0, opacité = 0 )

J'ai essayé de résoudre ce problème ici http://codepen.io/danijel/pen/RaboxO mais mon code est incapable de passer correctement la boîte. Le style de la boîte saute immédiatement à une largeur / hauteur de 200 pixels au lieu de la transition.

Qu'est-ce qui ne va pas avec le code?

let Motion = ReactMotion.Motion let TransitionMotion = ReactMotion.TransitionMotion let spring = ReactMotion.spring let presets = ReactMotion.presets const Demo = React.createClass({ getInitialState() { return { items: [] } }, componentDidMount() { let ctr = 0 setInterval(() => { ctr++ console.log(ctr) if (ctr % 2 == 0) { this.setState({ items: [{key: 'b', width: 200, height: 200, opacity: 1}], // fade box in }); } else { this.setState({ items: [], // fade box out }); } }, 1000) }, willLeave() { // triggered when c's gone. Keeping c until its width/height reach 0. return {width: spring(0), height: spring(0), opacity: spring(0)}; }, willEnter() { return {width: 0, height: 0, opacity: 1}; }, render() { return ( <TransitionMotion willEnter={this.willEnter} willLeave={this.willLeave} defaultStyles={this.state.items.map(item => ({ key: item.key, style: { width: 0, height: 0, opacity: 0 }, }))} styles={this.state.items.map(item => ({ key: item.key, style: { width: item.width, height: item.height, opacity: item.opacity }, }))} > {interpolatedStyles => <div> {interpolatedStyles.map(config => { return <div key={config.key} style={{...config.style, backgroundColor: 'yellow'}}> <div className="label">{config.style.width}</div> </div> })} </div> } </TransitionMotion> ); }, }); ReactDOM.render(<Demo />, document.getElementById('app')); 

Selon la documentation des styles sous la section TransitionMotion (et je ne prétends pas l'avoir compris entièrement :)):

Styles: … un tableau de TransitionStyle …

La chose clé à noter ici est qu'il existe 2 types d'objets de style que cette bibliothèque traite (ou du moins cette partie de TransitionMotion ) et cela les appelle TransitionStyle et TransitionPlainStyle .

Les valeurs précédentes passées dans l'attribut styles étaient de TransitionPlainStyle . Les modifications vers TransitionStyle commencent magiquement à animer la séquence Enter .

Vous pouvez en savoir plus sur 2 types différents mentionnés ci-dessus ici .

 styles={this.state.items.map(item => ({ key: item.key, style: { width: spring(item.width), height: spring(item.height), opacity: spring(item.opacity) } }))} 

Démo de codeur bifurqué .

Encore une fois, je ne comprends pas entièrement le fonctionnement interne de celui-ci. Je sais juste que vos styles ont dû être changés de la manière ci-dessus pour que cela fonctionne.

Je serai heureux si quelqu'un peut m'éduquer sur ce sujet aussi.

J'espère que cela t'aides.