Mi estructura se ve de la siguiente manera:
Component 1
- |- Component 2
- - |- Component 4
- - - |- Component 5
Component 3
El componente 3 debería mostrar algunos datos dependiendo del estado del componente 5. Dado que los accesorios son inmutables, no puedo simplemente guardar su estado en el componente 1 y reenviarlo, ¿verdad? Y sí, he leído sobre redux, pero no quiero usarlo. Espero que sea posible resolverlo solo con reaccionar. ¿Me equivoco?
<MyChildComponent setState={(s,c)=>{this.setState(s, c)}} />
Si va a utilizar este truco, asegúrese de admitir la devolución de llamada.this.setState(p)
? Lo intenté sin ellos y parece funcionar (soy muy nuevo en React)Respuestas:
Para la comunicación entre padres e hijos, debe pasar una función que establezca el estado de padres a hijos, de esta manera
De esta manera, el niño puede actualizar el estado del padre con la llamada de una función pasada con accesorios.
Pero tendrá que repensar la estructura de sus componentes, porque, según tengo entendido, los componentes 5 y 3 no están relacionados.
Una posible solución es envolverlos en un componente de nivel superior que contendrá el estado de los componentes 1 y 3. Este componente establecerá el estado de nivel inferior a través de accesorios.
fuente
this.handler = this.handler.bind(this)
constructor,this
dentro de lahandler
función se hará referencia al cierre de la función, no a la clase. Si no desea vincular todas sus funciones en el constructor, hay dos formas más de lidiar con esto utilizando las funciones de flecha. Simplemente podría escribir el controlador de clic comoonClick={()=> this.setState(...)}
, o podría usar los inicializadores de propiedades junto con las funciones de flecha como se describe aquí babeljs.io/blog/2015/06/07/react-on-es6-plus en "Funciones de flecha"Encontré la siguiente solución de trabajo para pasar el argumento de la función Click del elemento secundario al componente primario:
Versión con pasar un método ()
Mira JSFIDDLE
Versión con pasar una función de flecha
Mira JSFIDDLE
fuente
<ChildB handleToUpdate = {handleToUpdate.bind(this)} />
¿Por qué tuve que atar de nuevo?this
se llame dentro del niño, sethis
refiera al estado del padre y no al del niño. Este es el cierre en su máxima expresión!Quiero agradecer a la respuesta más votada por darme la idea de mi propio problema, básicamente, la variación de la misma con la función de flecha y pasar el parámetro del componente secundario:
Espero que ayude a alguien.
fuente
this
funciones de flecha en se refieren al contexto de los padres (es decir, laParent
clase).Me gusta la respuesta con respecto a pasar funciones, es una técnica muy útil.
Por otro lado, también puede lograr esto usando pub / sub o usando una variante, un despachador, como lo hace Flux . La teoría es súper simple, haga que el componente 5 envíe un mensaje que el componente 3 está escuchando. El componente 3 luego actualiza su estado, lo que desencadena el renderizado. Esto requiere componentes con estado que, según su punto de vista, pueden ser o no un antipatrón. Estoy en contra de ellos personalmente y preferiría que algo más esté escuchando los despachos y cambie el estado desde arriba hacia abajo (Redux hace esto, pero agrega terminología adicional).
Los paquetes de despachador con Flux son muy simples, simplemente registra devoluciones de llamada e invoca cuando ocurre cualquier despacho, pasando por el contenido del despacho (en el ejemplo anterior no hay
payload
con el despacho, simplemente una identificación de mensaje). Puede adaptar esto al pub / sub tradicional (por ejemplo, usando EventEmitter de eventos, o alguna otra versión) muy fácilmente si eso tiene más sentido para usted.fuente
var Dispatcher = require( 'flux' ).Dispatcher
Encontré la siguiente solución de trabajo para pasar el argumento de la función Click del elemento secundario al componente primario con param:
clase para padres:
clase infantil:
fuente
param1
solo se muestra en la consola, no se asigna, siempre se asignatrue
Cuando necesite comunicarse entre el niño y el padre en cualquier nivel inferior, entonces es mejor hacer uso del contexto . En el componente principal, defina el contexto que puede invocar el elemento secundario, como
puedes encontrar el proyecto Demo en el repositorio
fuente
Parece que solo podemos pasar datos de padre a hijo a medida que reacciona promueve el Flujo de datos unidireccional, pero para hacer que el padre se actualice cuando algo sucede en su "componente hijo", generalmente usamos lo que se llama una "función de devolución de llamada".
En este ejemplo, podemos pasar datos desde SubChild -> Child -> Parent pasando la función a su hijo directo.
fuente
He usado una respuesta de alta calificación de esta página muchas veces, pero mientras aprendía React, encontré una mejor manera de hacerlo, sin vinculación y sin función en línea dentro de los accesorios.
Solo mira aquí:
La clave está en una función de flecha:
Puedes leer más aquí . Espero que esto sea útil para alguien =)
fuente
-Podemos crear ParentComponent y con el método handleInputChange para actualizar el estado ParentComponent. Importa el ChildComponent y pasamos dos accesorios del componente padre al hijo, es decir, la función handleInputChange y la cuenta.
Ahora creamos el archivo ChildComponent y lo guardamos como ChildComponent.jsx. Este componente no tiene estado porque el componente hijo no tiene un estado. Utilizamos la biblioteca de tipos de utilería para la verificación de tipos de utilería.
fuente
Si este mismo escenario no se extiende a todas partes, puede usar el contexto de React, especialmente si no desea introducir todos los gastos generales que introducen las bibliotecas de administración de estado. Además, es más fácil de aprender. Pero tenga cuidado, podría usarlo en exceso y comenzar a escribir código incorrecto. Básicamente, usted define un componente Contenedor (que mantendrá y mantendrá esa parte del estado para usted) haciendo que todos los componentes interesados en escribir / leer esa parte de sus datos sean sus elementos secundarios (no necesariamente elementos secundarios directos)
https://reactjs.org/docs/context.html
También puede usar React simple en su lugar.
pase doSomethingAbout5 hasta el Componente 1
Si este es un problema común, debe comenzar a pensar en trasladar todo el estado de la aplicación a otro lugar. Tienes algunas opciones, las más comunes son:
https://redux.js.org/
https://facebook.github.io/flux/
Básicamente, en lugar de administrar el estado de la aplicación en su componente, envía comandos cuando sucede algo para actualizar el estado. Los componentes también extraen el estado de este contenedor para que todos los datos estén centralizados. Esto no significa que ya no pueda usar el estado local, pero ese es un tema más avanzado.
fuente
entonces, si quieres actualizar el componente padre,
Aquí onChange es un atributo con el método "controlador" vinculado a su instancia. Pasamos el manejador de métodos al componente de clase Child, para recibir a través de la propiedad onChange en su argumento props.
El atributo onChange se establecerá en un objeto de utilería como este:
y pasó al componente hijo
Por lo tanto, el componente Child puede acceder al valor del nombre en el objeto props como este props.onChange
Se realiza mediante el uso de accesorios de renderizado.
Ahora el componente secundario tiene un botón "Click" con un evento onclick configurado para llamar al método del controlador que se le pasó a través de onChnge en su objeto de argumento de accesorios. Así que ahora this.props.onChange in Child contiene el método de salida en la clase principal Referencia y créditos: bits y piezas
fuente
Así es como lo hago.
fuente
La mayoría de las respuestas dadas anteriormente son para diseños basados en React.Component. Si está utilizando
useState
las actualizaciones recientes de la biblioteca React, siga esta respuestafuente
fuente