Ma structure se présente comme suit:
Component 1
- |- Component 2
- - |- Component 4
- - - |- Component 5
Component 3
Le composant 3 devrait afficher certaines données en fonction de l'état du composant 5. Étant donné que les accessoires sont immuables, je ne peux pas simplement enregistrer son état dans le composant 1 et le transmettre, non? Et oui, j'ai lu sur redux, mais je ne veux pas l'utiliser. J'espère qu'il est possible de le résoudre simplement en réagissant. Ai-je tort?
<MyChildComponent setState={(s,c)=>{this.setState(s, c)}} />
si vous allez utiliser ce hack, assurez-vous de prendre en charge le rappel.this.setState(p)
? J'ai essayé sans eux et cela semble fonctionner (je suis très nouveau sur React)Réponses:
Pour la communication enfant-parent, vous devez passer une fonction définissant l'état du parent à l'enfant, comme ceci
De cette façon, l'enfant peut mettre à jour l'état du parent avec l'appel d'une fonction passée avec des accessoires.
Mais vous devrez repenser la structure de vos composants, car si je comprends bien, les composants 5 et 3 ne sont pas liés.
Une solution possible consiste à les envelopper dans un composant de niveau supérieur qui contiendra l'état des composants 1 et 3. Ce composant définira l'état de niveau inférieur via des accessoires.
la source
this.handler = this.handler.bind(this)
de constructeur, l'this
intérieur de lahandler
fonction référencera la fermeture de la fonction, pas la classe. Si vous ne souhaitez pas lier toutes vos fonctions dans le constructeur, il existe deux autres façons de gérer cela en utilisant les fonctions fléchées. Vous pouvez simplement écrire le gestionnaire de clics en tant queonClick={()=> this.setState(...)}
, ou vous pouvez utiliser les initialiseurs de propriété avec les fonctions de flèche comme décrit ici babeljs.io/blog/2015/06/07/react-on-es6-plus sous "Fonctions de flèche"J'ai trouvé la solution de travail suivante pour passer l'argument de la fonction onClick de l'enfant au composant parent:
Version avec passage d'une méthode ()
Regardez JSFIDDLE
Version avec passage d'une fonction Flèche
Regardez JSFIDDLE
la source
<ChildB handleToUpdate = {handleToUpdate.bind(this)} />
Pourquoi avoir à relier à nouveau?this
est appelé à l'intérieur de l'enfant, sethis
réfère à l'état du parent et non à celui de l'enfant. C'est la fermeture à son meilleur!Je tiens à remercier la réponse la plus votée de m'avoir donné l'idée de mon propre problème, essentiellement la variation de celui-ci avec la fonction flèche et la transmission des paramètres du composant enfant:
J'espère que cela aide quelqu'un.
la source
this
fonctions de flèche dans se réfèrent au contexte du parent (c.Parent
-à- d. Classe).J'aime la réponse concernant le passage des fonctions, c'est une technique très pratique.
D'un autre côté, vous pouvez également y parvenir en utilisant pub / sub ou en utilisant une variante, un répartiteur, comme le fait Flux . La théorie est super simple, demandez au composant 5 d'envoyer un message que le composant 3 écoute. Le composant 3 met alors à jour son état qui déclenche le nouveau rendu. Cela nécessite des composants avec état qui, selon votre point de vue, peuvent ou non être un anti-modèle. Je suis contre eux personnellement et préférerais que quelque chose d'autre écoute les dépêches et les changements d'état de haut en bas (Redux le fait, mais ajoute une terminologie supplémentaire).
Le bundle dispatcher avec Flux est très simple, il enregistre simplement les rappels et les appelle quand une expédition se produit, en passant par le contenu de l'envoi (dans l'exemple laconique ci-dessus, il n'y a pas
payload
avec l'envoi, simplement un identifiant de message). Vous pouvez l'adapter très facilement au pub / sub traditionnel (par exemple en utilisant l'EventEmitter d'événements, ou une autre version) si cela vous semble plus logique.la source
var Dispatcher = require( 'flux' ).Dispatcher
J'ai trouvé la solution de travail suivante pour passer l'argument de la fonction onClick de l'enfant au composant parent avec param:
classe parent:
classe enfant:
la source
param1
ne fait qu'être affiché sur la console et n'est pas assigné, il attribue toujourstrue
Chaque fois que vous avez besoin de communiquer entre un enfant et un parent à n'importe quel niveau, il est préférable d'utiliser le contexte . Dans le composant parent, définissez le contexte qui peut être invoqué par l'enfant, tel que
vous pouvez trouver un projet de démonstration au repo
la source
Il semble que nous ne pouvons transmettre des données que du parent à l'enfant car react favorise le flux de données unidirectionnel, mais pour que le parent se mette à jour lorsqu'il se passe quelque chose dans son "composant enfant", nous utilisons généralement ce qu'on appelle une "fonction de rappel".
Dans cet exemple, nous pouvons faire passer des données de SubChild -> Child -> Parent en passant la fonction à son enfant direct.
la source
J'ai utilisé plusieurs fois la réponse la mieux notée de cette page, mais en apprenant React, j'ai trouvé une meilleure façon de le faire, sans liaison et sans fonction intégrée dans les accessoires.
Regardez ici:
La clé est dans une fonction de flèche:
Vous pouvez en lire plus ici . J'espère que cela sera utile pour quelqu'un =)
la source
-Nous pouvons créer ParentComponent et avec la méthode handleInputChange pour mettre à jour l'état ParentComponent. Importez le ChildComponent et nous transmettons deux accessoires du parent au composant enfant, c'est-à-dire la fonction et le comptage de handleInputChange.
Maintenant, nous créons le fichier ChildComponent et l'enregistrons sous ChildComponent.jsx. Ce composant est sans état car le composant enfant n'a pas d'état. Nous utilisons la bibliothèque prop-types pour la vérification du type d'accessoires.
la source
Si ce même scénario n'est pas répandu partout, vous pouvez utiliser le contexte de React, spécialement si vous ne voulez pas introduire tous les frais généraux introduits par les bibliothèques de gestion d'état. De plus, c'est plus facile à apprendre. Mais attention, vous pourriez en abuser et commencer à écrire du mauvais code. Fondamentalement, vous définissez un composant Conteneur (qui détiendra et gardera cet élément d'état pour vous) faisant de tous les composants intéressés à écrire / lire ce morceau de données ses enfants (pas nécessairement des enfants directs)
https://reactjs.org/docs/context.html
À la place, vous pouvez également utiliser plain React correctement.
passez doSomethingAbout5 au composant 1
S'il s'agit d'un problème courant, vous devriez commencer à penser à déplacer l'ensemble de l'état de l'application vers un autre endroit. Vous avez quelques options, les plus courantes sont:
https://redux.js.org/
https://facebook.github.io/flux/
Fondamentalement, au lieu de gérer l'état de l'application dans votre composant, vous envoyez des commandes lorsque quelque chose se produit pour obtenir l'état mis à jour. Les composants extraient également l'état de ce conteneur afin que toutes les données soient centralisées. Cela ne signifie pas que vous ne pouvez plus utiliser l'état local, mais c'est un sujet plus avancé.
la source
donc, si vous voulez mettre à jour le composant parent,
Ici onChange est un attribut avec la méthode "handler" liée à son instance. nous avons passé le gestionnaire de méthode au composant de classe Child, pour recevoir via la propriété onChange dans son argument props.
L'attribut onChange sera défini dans un objet props comme ceci:
et passé au composant enfant
Ainsi, le composant enfant peut accéder à la valeur de nom dans l'objet props comme celui-ci props.onChange
Son fait grâce à l'utilisation d'accessoires de rendu.
Maintenant, le composant enfant a un bouton «Click» avec un événement onclick défini pour appeler la méthode du gestionnaire qui lui est passée via onChnge dans son objet argument props. Alors maintenant, this.props.onChange in Child contient la méthode de sortie dans la classe Parent Reference and credits: Bits and Pieces
la source
C'est comme ça que je le fais.
la source
La plupart des réponses ci-dessus concernent les conceptions basées sur React.Component. Si vous l'utilisez
useState
dans les récentes mises à niveau de la bibliothèque React, suivez cette réponsela source
la source