Quelque chose d'aussi simple devrait être facilement accompli, mais je m'arrache les cheveux en raison de sa complexité.
Tout ce que je veux faire, c'est animer le montage et le démontage d'un composant React, c'est tout. Voici ce que j'ai essayé jusqu'à présent et pourquoi chaque solution ne fonctionnera pas:
ReactCSSTransitionGroup
- Je n'utilise pas du tout de classes CSS, ce sont tous des styles JS, donc cela ne fonctionnera pas.ReactTransitionGroup
- Cette API de niveau inférieur est excellente, mais elle vous oblige à utiliser un rappel lorsque l'animation est terminée, donc l'utilisation de transitions CSS ne fonctionnera pas ici. Il existe toujours des bibliothèques d'animations, ce qui conduit au point suivant:- GreenSock - La licence est trop restrictive pour une utilisation professionnelle de l'OMI.
- React Motion - Cela semble génial, mais
TransitionMotion
est extrêmement déroutant et trop compliqué pour ce dont j'ai besoin. - Bien sûr, je peux juste faire de la supercherie comme le fait Material UI, où les éléments sont rendus mais restent cachés (
left: -10000px
) mais je préfère ne pas suivre cette voie. Je considère que c'est piraté, et je veux que mes composants se démontent pour qu'ils nettoient et n'encombrent pas le DOM.
Je veux quelque chose de facile à mettre en œuvre. Au montage, animez un ensemble de styles; au démontage, animez le même (ou un autre) ensemble de styles. Terminé. Il doit également être performant sur plusieurs plates-formes.
J'ai heurté un mur de briques ici. Si quelque chose me manque et qu'il existe un moyen simple de le faire, faites-le moi savoir.
transform: scale
.thing { color: #fff; }
) avec les styles JS (const styles = { thing: { color: '#fff' } }
))Réponses:
C'est un peu long mais j'ai utilisé tous les événements et méthodes natifs pour réaliser cette animation. Non
ReactCSSTransitionGroup
,ReactTransitionGroup
etc.Les choses que j'ai utilisées
onTransitionEnd
un événementComment ça marche
mounted
) et avec le style par défaut (opacity: 0
)componentDidMount
(componentWillReceiveProps
pour d'autres mises à jour) pour changer le style (opacity: 1
) avec un délai (pour le rendre asynchrone).opacity: 0
)onTransitionEnd
, supprimez le démontage de l'élément du DOM.Continuez le cycle.
Parcourez le code, vous comprendrez. Si des éclaircissements sont nécessaires, veuillez laisser un commentaire.
J'espère que cela t'aides.
la source
onTransitionEnd
? Je ne le vois pas dans la documentation React.componentWillReceiveProps
pouvez retourner quelque chose? Où puis-je en savoir plus à ce sujet?Parent
composant, vous référencezthis.transitionEnd
En utilisant les connaissances acquises grâce à la réponse de Pranesh, j'ai proposé une solution alternative configurable et réutilisable:
Usage:
Et enfin, dans la
render
méthode d' un autre composant :la source
componentWillLeave()
etcomponentWillEnter()
être appeléAnimatedMount
?Voici ma solution utilisant la nouvelle API de hooks (avec TypeScript), basée sur cet article , pour retarder la phase de démontage du composant:
Usage:
Lien CodeSandbox .
la source
J'ai contré ce problème pendant mon travail, et aussi simple que cela puisse paraître, ce n'est vraiment pas dans React. Dans un scénario normal où vous rendez quelque chose comme:
au fur et à mesure des
this.state.show
changements, les enfants sont montés / démontés tout de suite.Une approche que j'ai adoptée consiste à créer un composant wrapper
Animate
et à l'utiliser commemaintenant en tant que
this.state.show
changements, nous pouvons percevoir les changements d'accessoires avecgetDerivedStateFromProps(componentWillReceiveProps)
et créer des étapes de rendu intermédiaires pour effectuer des animations.Nous commençons par Static Stage lorsque les enfants sont montés ou démontés.
Une fois que nous détectons les
show
changements d'indicateur, nous entrons dans la phase de préparation où nous calculons les propriétés nécessaires commeheight
et àwidth
partir deReactDOM.findDOMNode.getBoundingClientRect()
.Ensuite, en entrant Animate State, nous pouvons utiliser la transition css pour changer la hauteur, la largeur et l'opacité de 0 aux valeurs calculées (ou à 0 en cas de démontage).
À la fin de la transition, nous utilisons l'
onTransitionEnd
API pour revenir à l'Static
étape.Il y a beaucoup plus de détails sur la façon dont les étapes se transfèrent en douceur, mais cela pourrait être une idée globale :)
Si quelqu'un est intéressé, j'ai créé une bibliothèque React https://github.com/MingruiZhang/react-animate-mount pour partager ma solution. Tout commentaire est le bienvenu :)
la source
Je pense que l'utilisation
Transition
dereact-transition-group
est probablement le moyen le plus simple de suivre le montage / démontage. C'est incroyablement flexible. J'utilise certaines classes pour montrer à quel point il est facile à utiliser, mais vous pouvez certainement connecter vos propres animations JS en utilisant desaddEndListener
accessoires - avec lesquels j'ai également eu beaucoup de chance avec GSAP.Bac à sable: https://codesandbox.io/s/k9xl9mkx2o
Et voici mon code.
la source
show
propH1
et exécuter toute la logique à l'intérieur du composant stylisé. Comme ...animation: ${({ show }) => show ? entranceKeyframes : exitKeyframes} 300ms ease-out forwards;
Mouvement du cadreur
Installez framer-motion à partir de npm.
la source
Pour ceux qui envisagent de réagir-motion, animer un seul composant lors de son montage et de son démontage peut être une tâche difficile à configurer.
Il existe une bibliothèque appelée react-motion-ui-pack qui facilite grandement le démarrage de ce processus. C'est un wrapper autour de react-motion, ce qui signifie que vous bénéficiez de tous les avantages de la bibliothèque (c'est-à-dire que vous pouvez interrompre l'animation, avoir plusieurs démontages en même temps).
Usage:
Enter définit ce que doit être l'état final du composant; congé est le style appliqué lorsque le composant est démonté.
Vous constaterez peut-être qu'une fois que vous avez utilisé le pack d'interface utilisateur plusieurs fois, la bibliothèque react-motion n'est peut-être plus aussi intimidante.
la source
L'animation des transitions d'entrée et de sortie est beaucoup plus facile avec react-move .
exemple sur codesandbox
la source
Cela peut être fait facilement en utilisant le
CSSTransition
composant fromreact-transition-group
, qui est exactement comme les bibliothèques que vous avez mentionnées. L'astuce est que vous devez envelopper le composant CSSTransition sans mécanisme d' affichage / masquage comme vous le feriez généralement .ie{show && <Child>}...
Sinon, vous masquez l' animation et cela ne fonctionnera pas. Exemple:la source
Voici mes 2cents: merci à @deckele pour sa solution. Ma solution est basée sur la sienne, c'est la version du composant stateful, entièrement réutilisable.
ici mon bac à sable: https://codesandbox.io/s/302mkm1m .
voici mon snippet.js:
la source
Voici comment j'ai résolu ce problème en 2019, en créant un spinner de chargement. J'utilise des composants fonctionnels React.
J'ai un composant d' application parent qui a un composant Spinner enfant .
L'application a un état indiquant si l'application se charge ou non. Lorsque l'application se charge, Spinner est rendu normalement. Lorsque l'application ne se charge pas (
isLoading
est faux) Spinner est rendu avec l'accessoireshouldUnmount
.App.js :
Spinner a un état pour savoir s'il est caché ou non. Au début, avec les accessoires et l'état par défaut, Spinner est rendu normalement. La
Spinner-fadeIn
classe l'anime en se fondant. Lorsque Spinner reçoit l'accessoire,shouldUnmount
il le rend avec laSpinner-fadeOut
classe à la place, l'animant en disparaissant.Cependant, je voulais aussi que le composant se démonte après la disparition.
À ce stade, j'ai essayé d'utiliser l'
onAnimationEnd
événement synthétique React, similaire à la solution de @ pranesh-ravi ci-dessus, mais cela n'a pas fonctionné. Au lieu de cela, j'avais l'habitudesetTimeout
de définir l'état sur hidden avec un délai de la même longueur que l'animation. Spinner se mettra à jour après le délai avecisHidden === true
, et rien ne sera rendu.La clé ici est que le parent ne démonte pas l'enfant, il dit à l'enfant quand le démonter et l'enfant se démonte après avoir pris en charge ses activités de démontage.
Spinner.js :
Spinner.css:
la source
J'avais aussi un besoin urgent d'animation à un seul composant. J'étais fatigué d'utiliser React Motion mais je me tirais les cheveux pour un problème aussi trivial ... (je truc). Après quelques recherches sur Google, je suis tombé sur ce post sur leur dépôt git. J'espère que cela aide quelqu'un.
Référencé de & aussi le crédit . Cela fonctionne pour moi à partir de maintenant. Mon cas d'utilisation était un modal pour animer et démonter en cas de chargement et de déchargement.
la source
Je sais qu'il y a beaucoup de réponses ici, mais je n'en ai toujours pas trouvé une qui réponde à mes besoins. Je voudrais:
Après de nombreuses heures de bidouillage, j'ai une solution qui fonctionne je dirais à 90%. J'ai écrit la limitation dans un bloc de commentaires dans le code ci-dessous. J'adorerais toujours une meilleure solution, mais c'est la meilleure que j'ai trouvée, y compris les autres solutions ici.
Si vous avez un composant que vous souhaitez faire apparaître / sortir en fondu, enveloppez-le dans
<Fade>
Ex.<Fade><MyComponent/><Fade>
.Notez que cela utilise
react-bootstrap
pour les noms de classe et pour<Container/>
, mais les deux peuvent être facilement remplacés par un CSS personnalisé et un ancien<div>
.la source
Si j'utilise
Velocity
ouAnimeJS
bibliothèque pour animer le nœud directement (au lieu decss
ousetTimeout
), alors j'ai découvert que je peux concevoir unhook
pour fournir le statut de l'animationon
et la fonctiononToggle
pour lancer l'animation (par exemple, glisser vers le bas, fondu).Fondamentalement, ce que fait le hook est d'activer et de désactiver l'animation, puis de mettre à jour le en
on
conséquence. Par conséquent, nous pouvons obtenir le statut de l'animation avec précision. Sans cela, je répondrais sur une base ad hocduration
.L'utilisation est la suivante,
et l'implémentation animée pourrait être,
la source
Vous pouvez utiliser React SyntheticEvent pour cela.
Avec des événements comme onAnimationEnd ou onTransitionEnd, vous pouvez accomplir cela.
React Docs: https://reactjs.org/docs/events.html#animation-events
Exemple de code: https://dev.to/michalczaplinski/super-easy-react-mount-unmount-animations-with-hooks-4foj
la source