Vous ne pouvez pas utiliser l' une des méthodes du cycle de vie existants ( componentDidMount
, componentDidUpdate
, componentWillUnmount
etc.) dans un crochet. Ils ne peuvent être utilisés que dans les composants de classe. Et avec Hooks, vous ne pouvez utiliser que des composants fonctionnels. La ligne ci-dessous provient du doc React:
Si vous êtes familier avec les méthodes React du cycle de vie de classe, vous pouvez penser à useEffect
crochet componentDidMount
, componentDidUpdate
et componentWillUnmount
combiné.
suggèrent que vous pouvez imiter ces méthodes de cycle de vie à partir d'un composant de classe dans un composant fonctionnel.
Le code à l'intérieur componentDidMount
s'exécute une fois lorsque le composant est monté. useEffect
hook équivalent pour ce comportement est
useEffect(() => {
// Your code here
}, []);
Notez le deuxième paramètre ici (tableau vide). Cela ne fonctionnera qu'une seule fois.
Sans le deuxième paramètre, le useEffect
hook sera appelé sur chaque rendu du composant qui peut être dangereux.
useEffect(() => {
// Your code here
});
componentWillUnmount
est utilisé pour le nettoyage (comme la suppression des écouteurs d'événements, l'annulation du minuteur, etc.). Supposons que vous ajoutez un écouteur d'événements componentDidMount
et que vous le supprimez componentWillUnmount
comme ci-dessous.
componentDidMount() {
window.addEventListener('mousemove', () => {})
}
componentWillUnmount() {
window.removeEventListener('mousemove', () => {})
}
L'équivalent du crochet du code ci-dessus sera le suivant
useEffect(() => {
window.addEventListener('mousemove', () => {});
// returned function will be called on component unmount
return () => {
window.removeEventListener('mousemove', () => {})
}
}, [])
useEffect()
fonction, merci.componentWillMount
componentWillMount
, noncomponentWillUnmount
. Cette réponse ne répond en effet pas du tout à la question, et ne fait que réitérer ce que l'OP impliquait déjà de savoir.useComponentDidMount hook
Dans la plupart des cas,
useComponentDidMount
c'est l'outil à utiliser. Il ne s'exécutera qu'une seule fois, après le montage du composant (rendu initial).useComponentWillMount
Il est important de noter qu'en classe, les composants
componentWillMount
sont considérés comme hérités. Si vous avez besoin de code à exécuter une seule fois avant le montage du composant, vous pouvez utiliser le constructeur. En savoir plus ici . Étant donné que le composant fonctionnel n'a pas l'équivalent d'un constructeur, l'utilisation d'un hook pour exécuter le code une seule fois avant le montage du composant peut avoir un sens dans certains cas. Vous pouvez y parvenir avec un crochet personnalisé.Cependant, il y a un écueil. Ne l'utilisez pas pour définir votre état de manière asynchrone (par exemple suite à une requête du serveur. Comme vous pourriez vous attendre à ce qu'il affecte le rendu initial, ce qu'il ne fera pas). De tels cas doivent être traités avec
useComponentDidMount
.Démo
Démo complète
la source
componentWillMount
based onuseEffect
présente deux problèmes. Le premier est qu'il n'y a pas de cycle de vie de montage dans les composants fonctionnels, les deux hooks s'exécuteront après le rendu du composant, ce quiRuns only once before component mounts
est trompeur. Le second est qu'ilcomponentWillMount
est appelé sur le rendu du serveur etuseEffect
ne l'est pas. De nombreuses bibliothèques s'appuient encore surUNSAFE_componentWillMount
car c'est actuellement le seul moyen de déclencher un effet secondaire côté serveur.Selon reactjs.org, componentWillMount ne sera plus pris en charge à l'avenir. https://reactjs.org/docs/react-component.html#unsafe_componentwillmount
Il n'est pas nécessaire d'utiliser componentWillMount.
Si vous voulez faire quelque chose avant le montage du composant, faites-le simplement dans le constructeur ().
Si vous souhaitez faire des requêtes réseau, ne le faites pas dans componentWillMount. C'est parce que cela entraînera des bogues inattendus.
Les requêtes réseau peuvent être effectuées dans componentDidMount.
J'espère que ça aide.
mis à jour le 08/03/2019
La raison pour laquelle vous demandez componentWillMount est probablement parce que vous souhaitez initialiser l'état avant les rendus.
Faites-le simplement dans useState.
ou peut-être que vous souhaitez exécuter une fonction dans componentWillMount, par exemple, si votre code d'origine ressemble à ceci:
avec hook, tout ce que vous avez à faire est de supprimer la méthode du cycle de vie:
Je veux juste ajouter quelque chose à la première réponse sur useEffect.
useEffect s'exécute sur chaque rendu, c'est une combinaison de componentDidUpdate, componentDidMount et ComponentWillUnmount.
Si nous ajoutons un tableau vide dans useEffect, il s'exécute juste lorsque le composant est monté. C'est parce que useEffect comparera le tableau que vous lui avez passé. Il n'est donc pas nécessaire que ce soit un tableau vide, il peut s'agir d'un tableau qui ne change pas. Par exemple, il peut s'agir de [1,2,3] ou ['1,2']. useEffect ne fonctionne toujours que lorsque le composant est monté.
Cela dépend de vous si vous voulez qu'il s'exécute une seule fois ou après chaque rendu. Ce n'est pas dangereux si vous avez oublié d'ajouter un tableau tant que vous savez ce que vous faites.
J'ai créé un échantillon pour le crochet. Vérifie s'il te plaît.
https://codesandbox.io/s/kw6xj153wr
mis à jour le 21/08/2019
C'est un blanc depuis que j'ai écrit la réponse ci-dessus. Il y a quelque chose auquel je pense que vous devez prêter attention. Lorsque vous utilisez
Lorsque react compare les valeurs que vous avez passées au tableau [], il utilise Object.is () pour comparer. Si vous lui passez un objet, tel que
C'est exactement la même chose que:
Il sera à nouveau rendu à chaque fois car lorsque Object.is () compare un objet, il compare sa référence et non la valeur elle-même. Il en va de même pour la raison pour laquelle {} === {} renvoie false car leurs références sont différentes. Si vous souhaitez toujours comparer l'objet lui-même et non la référence, vous pouvez faire quelque chose comme ceci:
la source
useLayoutEffect
pourrait accomplir cela avec un ensemble vide d'observateurs ([]
) si la fonctionnalité est en fait similaire àcomponentWillMount
- elle s'exécutera avant que le premier contenu n'atteigne le DOM - bien qu'il y ait en fait deux mises à jour mais elles sont synchrones avant de dessiner à l'écran.par exemple:
L'avantage par rapport
useState
à un initialiseur / setter ouuseEffect
bien qu'il puisse calculer une passe de rendu, il n'y a pas de re-rendus réels vers le DOM qu'un utilisateur remarquera, et il est exécuté avant le premier rendu notable, ce qui n'est pas le cas pouruseEffect
. L'inconvénient est bien sûr un léger retard dans votre premier rendu car une vérification / mise à jour doit avoir lieu avant de peindre à l'écran. Cela dépend vraiment de votre cas d'utilisation, cependant.Personnellement, je pense que
useMemo
c'est bien dans certains cas de niche où vous devez faire quelque chose de lourd - tant que vous gardez à l'esprit que c'est l'exception par rapport à la norme.la source
Voici comment je simule le constructeur dans les composants fonctionnels à l'aide du
useRef
hook:Voici l'exemple de cycle de vie:
Bien sûr, les composants de classe n'ont pas d'
Body
étapes, il n'est pas possible de faire une simulation 1: 1 en raison de différents concepts de fonctions et de classes.la source
J'ai écrit un hook personnalisé qui exécutera une fonction une fois avant le premier rendu.
useBeforeFirstRender.js
Usage:
la source
Il existe une belle solution de contournement à mettre en œuvre
componentDidMount
etcomponentWillUnmount
avecuseEffect
.Basé sur la documentation,
useEffect
peut renvoyer une fonction de "nettoyage". cette fonction ne sera pas appelée lors du premieruseEffect
appel, uniquement lors des appels suivants.Par conséquent, si nous utilisons le
useEffect
hook sans aucune dépendance, le hook ne sera appelé que lorsque le composant est monté et la fonction "cleanup" est appelée lorsque le composant est démonté.L'appel de la fonction de retour de nettoyage est appelé uniquement lorsque le composant est démonté.
J'espère que cela t'aides.
la source
useEffect
appel, vous obtenez la même fonctionnalitécomponentWillMount
etcomponentWillUnmount
d'une manière agréable et propreuseEffect
ne s'exécute qu'après un rendu tandis quecomponentWillMount
s'exécute avant le rendu du composant.componentDidMount
pascomponentWillMount
. J'ai raté ça dans la question, mon mauvais.Vous pouvez pirater le hook useMemo pour imiter un événement de cycle de vie componentWillMount. Faites simplement:
Vous devez conserver le hook useMemo avant tout ce qui interagit avec votre état. Ce n'est pas ainsi que cela est prévu, mais cela a fonctionné pour moi pour tous les problèmes de componentWillMount.
Cela fonctionne parce que useMemo ne nécessite pas de retourner une valeur et que vous n'avez pas à l'utiliser comme quoi que ce soit, mais comme il mémorise une valeur basée sur des dépendances qui ne s'exécutera qu'une seule fois ("[]") et c'est au-dessus de notre composant, il s'exécute une fois lorsque le composant se monte avant toute autre chose.
la source
https://reactjs.org/docs/hooks-reference.html#usememo
la source
La réponse de Ben Carp me semble la seule valable.
Mais comme nous utilisons des moyens fonctionnels, une autre approche peut bénéficier de la fermeture et du HoC:
Alors utilisez-le:
la source
Réponse courte à votre question initiale , comment
componentWillMount
utiliser avec React Hooks:componentWillMount
est obsolète et considérée comme héritée . Recommandation de réaction :Maintenant, dans la FAQ Hook, vous découvrez ce qu'est l'équivalent d'un constructeur de classe pour les composants de fonction:
Donc, un exemple d'utilisation de
componentWillMount
ressemble à ceci:la source
Ajoutez simplement un tableau de dépendances vide dans useEffect, il fonctionnera comme
componentDidMount
.la source
Il existe une astuce simple pour simuler
componentDidMount
etcomponentWillUnmount
en utilisantuseEffect
:la source