Concernant le nouvellement proposé React Effect Hook ;
Quels sont les avantages et les cas d'utilisation du hook Effect
(useEffect()
)?
Pourquoi serait-il préférable et en quoi diffère-t-il de componentDidMount/componentDidUpdate/componentWillUnmount
(performances/lisibilité)?
La documentation indique que:
Les mutations, abonnements, minuteries, journalisation et autres effets secondaires ne sont pas autorisés dans le corps principal d'un composant de fonction (appelé phase de rendu de React).
mais je pense qu'il était déjà de notoriété publique d'avoir ces comportements dans les méthodes de cycle de vie comme componentDidUpdate, etc. au lieu de la méthode de rendu.
Il y a aussi la mention que:
La fonction passée à useEffect s'exécutera une fois le rendu validé à l'écran.
mais n'est-ce pas ce que componentDidMount
& componentDidUpdate
fait de toute façon?
Quels sont les avantages et les cas d'utilisation du hook
Effect
(useEffect()
)?
Principalement, les hooks en général permettent l'extraction et la réutilisation de la logique dynamique qui est commune à plusieurs composants sans la charge des composants d'ordre supérieur ou des accessoires de rendu.
Un avantage secondaire (des crochets d'effets en particulier) est d'éviter les bogues qui pourraient autrement se produire si les effets secondaires dépendant de l'état ne sont pas correctement gérés dans componentDidUpdate
(puisque les crochets d'effets garantissent que ces effets secondaires sont configurés et déchirés). vers le bas sur chaque rendu).
Voir également les avantages de performance et de lisibilité détaillés ci-dessous.
Tout composant qui implémente une logique avec état à l'aide de méthodes de cycle de vie - le crochet d'effet est une "meilleure façon".
Pourquoi serait-il préférable et en quoi diffère-t-il de
componentDidMount
/componentDidUpdate
/componentWillUnmount
(performances/lisibilité)?
En raison des avantages détaillés ci-dessus et ci-dessous.
Crochets à effets—
Les crochets d'effet entraînent:
des composants plus simples et plus faciles à gérer, grâce à la possibilité de diviser les comportements non liés qui devaient auparavant être exprimés à travers le même ensemble de méthodes de cycle de vie en un seul crochet pour chacun de ces comportements, par exemple:
componentDidMount() {
prepareBehaviourOne();
prepareBehaviourTwo();
}
componentDidUnmount() {
releaseBehaviourOne();
releaseBehaviourTwo();
}
devient:
useEffect(() => {
prepareBehaviourOne();
return releaseBehaviourOne;
});
useEffect(() => {
prepareBehaviourTwo();
return releaseBehaviourTwo;
});
Notez que le code relatif à BehaviourOne
est maintenant distinctement distinct de celui relatif à BehaviourTwo
, alors qu'auparavant il était mêlé à chaque méthode de cycle de vie.
moins de passe-partout, en raison de l'élimination de tout besoin de répéter le même code sur plusieurs méthodes de cycle de vie (comme cela est courant entre componentDidMount
et componentDidUpdate
) - par exemple:
componentDidMount() {
doStuff();
}
componentDidUpdate() {
doStuff();
}
devient:
useEffect(doStuff); // you'll probably use an arrow function in reality
Voici un exemple tiré de ReactConf2018 le discours de Dan Abramov expliquant la différence:
Voici les quelques résultats de l'exemple ci-dessous:
useEffect()
Contrairement à componentDidMount et componentDidUpdate, la fonction passée à useEffect se déclenche après la mise en page et Paint, lors d'un événement différé
useEffect()
, ce qui est très efficace lorsque vous passez simplement un tableau vide [] pour rendre le composant uniquement lors du montage et du démontage.useEffect()
pour séparer les préoccupations et réagir:Hooks nous permet de diviser le code en fonction de ce qu'il fait plutôt que d'un nom de méthode de cycle de vie. React appliquera tous les effets utilisés par le composant, dans l'ordre où ils ont été spécifiés
tilisation de classes:
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
componentDidMount() {
document.title = `You clicked ${this.state.count} times`;
}
componentDidUpdate() {
document.title = `You clicked ${this.state.count} times`;
}
render() {
return (
<div>
<p>You clicked {this.state.count} times</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
Click me
</button>
</div>
);
}
}
en utilisant des crochets:
import { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// Similar to componentDidMount and componentDidUpdate:
useEffect(() => {
// Update the document title using the browser API
document.title = `You clicked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}