J'essayais avec la nouvelle fonctionnalité Crochet dans React. Considérant que j'ai les deux composants suivants (en utilisant des crochets de réaction) -
const HookComponent = () => {
const [username, setUsername] = useState('Abrar');
const [count, setState] = useState();
const handleChange = (e) => {
setUsername(e.target.value);
}
return (
<div>
<input name="userName" value={username} onChange={handleChange}/>
<p>{username}</p>
<p>From HookComponent: {count}</p>
</div>
)
}
const HookComponent2 = () => {
const [count, setCount] = useState(999);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
Les crochets prétendent résoudre le problème du partage de la logique avec état entre les composants mais j’ai constaté que les états entre HookComponent
et HookComponent2
ne sont pas partageables. Par exemple, le changement de count
dans HookComponent2
ne rend pas un changement dans HookComponent
.
Est-il possible de partager des états entre des composants à l'aide du hook useState()
?
Si vous faites référence à l'état du composant, les points d'ancrage ne vous aideront pas à le partager entre les composants. L'état du composant est local pour le composant. Si votre état vit dans son contexte, alors useContext
hook serait utile.
Fondamentalement, je pense que vous avez mal compris la ligne "partage de la logique avec état entre composants". La logique avec état est différente de l'état. La logique avec état est une chose que vous faites qui modifie l'état. Par exemple, un composant s'abonnant à un magasin dans componentDidMount()
et se désabonnant à componentWillUnmount()
. Ce comportement abonnement/désabonnement peut être implémenté dans un hook et les composants qui en ont besoin peuvent simplement utiliser le hook.
Si vous souhaitez partager un état entre des composants, vous pouvez le faire de différentes manières, chacune avec ses propres mérites:
Soulevez l’état jusqu’à un composant ancestral commun des deux composants.
function Ancestor() {
const [count, setCount] = useState(999);
return <>
<DescendantA count={count} />
<DescendantB count={count} />
</>;
}
Cette approche de partage d'état n'est pas fondamentalement différente de la manière traditionnelle d'utiliser l'état, les crochets nous donnent simplement une manière différente de déclarer l'état d'un composant.
Si les descendants sont trop profonds dans la hiérarchie des composants et que vous ne souhaitez pas transmettre l'état à un trop grand nombre de couches, vous pouvez utiliser le API de contexte .
Il existe un crochet useContext
que vous pouvez utiliser au sein des composants enfants.
Bibliothèques de gestion d'état telles que Redux ou Mobx. Votre état habitera ensuite dans un magasin en dehors de React et les composants pourront se connecter/s'abonner au magasin pour recevoir les mises à jour.
le doc déclare:
Nous importons le crochet useState de React. Cela nous permet de conserver l'état local dans un composant de fonction.
il n'est pas mentionné que l'état puisse être partagé entre plusieurs composants. useState
hook vous donne simplement un moyen plus rapide de déclarer un champ d'état et son opérateur correspondant en une seule instruction.
Vous devrez toujours lever votre état jusqu'à un composant ancêtre de HookComponent1 et HookComponent2. C’est ainsi que vous partagez l’état précédent et que la dernière API de hook ne change rien à ce sujet.