Cette réponse vise à fournir suffisamment d'informations pour ne pas changer/modifier l'état directement dans React.
React suit Flux de données unidirectionnel . En d'autres termes, le flux de données à l'intérieur de react devrait et sera censé suivre un chemin circulaire.
Flux de données de React sans flux
Pour faire fonctionner React de cette manière, les développeurs ont rendu React similaire à programmation fonctionnelle . La règle d'or de la programmation fonctionnelle est la suivante immuabilité . Laissez-moi vous l'expliquer haut et fort.
Comment fonctionne le flux unidirectionnel ?
-
states
sont un magasin de données qui contient les données d'un composant.
- Le site
view
d'un composant est rendu en fonction de l'état.
- Lorsque le
view
doit changer quelque chose à l'écran, cette valeur doit être fournie par l'interface de l'utilisateur. store
.
- Pour ce faire, React fournit
setState()
qui prend en compte un object
de nouveaux states
et fait une comparaison et une fusion (similaire à object.assign()
) sur l'état précédent et ajoute le nouvel état au magasin de données d'état.
- Chaque fois que les données dans le magasin d'état changent, react déclenchera un re-rendu avec le nouvel état que l'utilisateur doit connaître.
view
consomme et l'affiche à l'écran.
Ce cycle se poursuivra pendant toute la durée de vie du composant.
Si vous voyez les étapes ci-dessus, cela montre clairement que beaucoup de choses se passent derrière lorsque vous changez l'état. Ainsi, lorsque vous mutez l'état directement et que vous appelez setState()
avec un objet vide. Le site previous state
sera pollué par votre mutation. A cause de cela, la comparaison et la fusion superficielles de deux états seront perturbées ou ne se produiront pas, car vous n'aurez plus qu'un seul état. Cela va perturber toutes les méthodes du cycle de vie de React.
En conséquence, votre application se comportera de manière anormale, voire se plantera. La plupart du temps, cela n'affectera pas votre application car toutes les applications que nous utilisons pour les tests sont assez petites.
Et un autre inconvénient de la mutation de Objects
et Arrays
En JavaScript, lorsque vous assignez un objet ou un tableau, vous faites juste une référence à cet objet ou ce tableau. Lorsque vous les mutez, toutes les références à cet objet ou ce tableau seront affectées. React gère cela de manière intelligente en arrière-plan et nous donne simplement une API pour le faire fonctionner.
Les erreurs les plus courantes commises lors de la gestion des états dans React
// original state
this.state = {
a: [1,2,3,4,5]
}
// changing the state in react
// need to add '6' in the array
// bad approach
const b = this.state.a.push(6)
this.setState({
a: b
})
Dans l'exemple ci-dessus, this.state.a.push(6)
va muter l'état directement. En l'assignant à une autre variable et en appelant setState
est identique à ce qui est montré ci-dessous. Comme nous avons muté l'état de toute façon, il n'y a pas de raison de l'assigner à une autre variable et d'appeler setState
avec cette variable.
// same as
this.state.a.push(6)
this.setState({})
Beaucoup de gens le font. C'est tellement faux . Cela brise la beauté de React et constitue une mauvaise pratique de programmation.
Alors, quelle est la meilleure façon de gérer les états dans React ? Laissez-moi vous expliquer.
Lorsque vous devez modifier "quelque chose" dans l'état existant, obtenez d'abord une copie de cette "chose" à partir de l'état actuel.
// original state
this.state = {
a: [1,2,3,4,5]
}
// changing the state in react
// need to add '6' in the array
// create a copy of this.state.a
// you can use ES6's destructuring or loadash's _.clone()
const currentStateCopy = [...this.state.a]
Maintenant, la mutation currentStateCopy
ne mutera pas l'état original. Effectuer des opérations sur currentStateCopy
et le définir comme le nouvel état en utilisant setState()
.
currentStateCopy.push(6)
this.setState({
a: currentStateCopy
})
C'est magnifique, non ?
En faisant cela, toutes les références de this.state.a
ne sera pas affecté jusqu'à ce que nous utilisions setState
. Cela vous donne le contrôle de votre code et cela vous aidera à écrire des tests élégants et vous donnera confiance dans les performances du code en production.
Pour répondre à votre question,
Pourquoi ne puis-je pas modifier directement l'état d'un composant ?
Oui, vous pouvez . Mais vous devez faire face aux conséquences suivantes.
- Lorsque vous passez à l'échelle, vous écrivez du code ingérable.
- Vous allez perdre le contrôle de
state
à travers les composants.
- Au lieu d'utiliser React, vous écrirez des codes personnalisés sur React.
L'immuabilité n'est pas une chose nécessaire car JavaScript est monofilaire. Mais, c'est une bonne pratique à suivre qui vous aidera à long terme.
PS. J'ai écrit environ 10000 lignes de code React JS mutable. Si ça casse maintenant, je ne sais pas où chercher car toutes les valeurs sont mutées quelque part. Quand j'ai réalisé cela, j'ai commencé à écrire du code immuable. Faites-moi confiance ! C'est la meilleure chose que vous puissiez faire pour un produit ou une application.
J'espère que cela vous aidera !
3 votes
Vérifiez le notes sous
setState
documentation . Il couvre certaines des bonnes raisons.0 votes
@Kujira J'ai mis à jour ma question pour aborder également les notes que vous avez mentionnées.
6 votes
Outre le fait que vous pensez pouvoir le contrôler, vous ne faites que court-circuiter le flux de travail d'un cadre. Javascript vous permet de le faire, mais gardez à l'esprit qu'une fois que vous avez brisé le modèle, le framework n'est plus responsable de la cohérence de votre état.
6 votes
Il ne s'agit pas de "ne pas pouvoir" muter l'état directement, mais de "ne pas devoir".
1 votes
Etrange, cette question a été posée il y a 4 mois et toujours pas de réponse acceptée, est-ce une question si difficile à répondre ? Je ne peux pas vraiment trouver de réponse à cette question en utilisant Google...
1 votes
J'ai posé une question similaire stackoverflow.com/questions/40213254/
0 votes
Alors il devient Anuglar1.