Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

138
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda