Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

143
Vistas
Cómo cambiar el estado del niño de otro niño sin volver a representar al padre

Quiero cambiar el contenido de un componente secundario en respuesta a un evento de usuario en otro componente secundario sin que el elemento principal se vuelva a procesar.

Intenté almacenar el setter de estado secundario en una variable en el elemento principal, pero no está definido en el momento en que todos los elementos secundarios se han renderizado, por lo que no funciona.

¿Hay una forma mínima de lograr esto (sin instalar una biblioteca de administración de estado)?

NiñoANiño.tsx

 import React, { Dispatch, SetStateAction, useEffect, useRef, useState, } from "react"; export default function ChildToChild() { const renderCounter = useRef(0); renderCounter.current = renderCounter.current + 1; let setChildOneContent; const childOneContentController = ( setter: Dispatch<SetStateAction<string>> ) => { setChildOneContent = setter; }; return ( <div> <h1>Don't re-render me please</h1> <p>No. Renders: {renderCounter.current}</p> <ChildOne childOneContentController={childOneContentController} /> <ChildTwo setChildOneContent={setChildOneContent} /> </div> ); } function ChildOne({ childOneContentController, }: { childOneContentController: (setter: Dispatch<SetStateAction<string>>) => void; }) { const [content, setContent] = useState("original content"); useEffect(() => { childOneContentController(setContent); }, [childOneContentController, setContent]); return ( <div> <h2>Child One</h2> <p>{content}</p> </div> ); } function ChildTwo({ setChildOneContent, }: { setChildOneContent: Dispatch<SetStateAction<string>> | undefined; }) { return ( <div> <h2>Child Two</h2> <button onClick={() => { if (setChildOneContent) setChildOneContent("content changed"); }} > Change Child One Content </button> </div> ); }
about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Deberías ser capaz de lograr por

  1. Uso del estado en componentes secundarios
  2. Usar una función de devolución de llamada en el componente principal que llama a la función setState del componente secundario. Esto desencadenará una nueva representación del niño pero no de sí mismo (padre).

Demostración: https://codesandbox.io/s/child-re-rendering-only-x37ol

about 4 years ago · Juan Pablo Isaza Denunciar

0

Para una sola vez, puede usar lo siguiente (otra ref para almacenar y usar ChildOne setContent :

 import React, { Dispatch, SetStateAction, useEffect, useRef, useState } from "react"; function ChildOne({ setChildOneRef }: { setChildOneRef: React.MutableRefObject<React.Dispatch< React.SetStateAction<string> > | null>; }) { const [content, setContent] = useState("original content"); useEffect(() => { setChildOneRef.current = setContent; }, [setChildOneRef]); return ( <div> <h2>Child One</h2> <p>{content}</p> </div> ); } function ChildTwo({ setChildOneRef }: { setChildOneRef: React.MutableRefObject<React.Dispatch< React.SetStateAction<string> > | null>; }) { return ( <div> <h2>Child Two</h2> <button onClick={() => { setChildOneRef.current?.("content changed"); }} > Change Child One Content </button> </div> ); } export function ChildToChild() { const renderCounter = useRef(0); renderCounter.current = renderCounter.current + 1; const setChildOneRef = useRef<Dispatch<SetStateAction<string>> | null>(null); return ( <div> <h1>Don't re-render me please</h1> <p>No. Renders: {renderCounter.current}</p> <ChildOne setChildOneRef={setChildOneRef} /> <ChildTwo setChildOneRef={setChildOneRef} /> </div> ); }

Si este patrón es común en su código, es posible que aún desee usar la biblioteca de administración de estado o evaluar si los "hijos" deben estar realmente separados.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Puede crear un objeto, almacenar el gancho en ese objeto y usar el gancho del objeto en los niños. No estoy seguro de por qué el recuento de salida se incrementa dos veces ...

 import { useState } from "react"; let parentRenderCount = 0; let child1RenderCount = 0; let child2RenderCount = 0; const Child1 = ( { stateHolder } ) => { const [count, setCount] = useState( 0 ) console.log('child1 render', ++child1RenderCount) stateHolder.count = count stateHolder.setCount = setCount return <div> {count} </div> } const Child2 = ( { stateHolder } ) => { console.log('child2 render', ++child2RenderCount) return <button onClick={() => stateHolder.setCount( stateHolder.count + 1 )}> clickme </button> } function App() { const stateHolder = { } console.log('parent render', ++parentRenderCount) return ( <div className="App"> <Child1 stateHolder={stateHolder} /> <Child2 stateHolder={stateHolder} /> </div> ); } export default App;
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda