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

128
Vistas
No se puede actualizar el estado del componente principal con React UseState

Me enfrento a este comportamiento extraño cuando trato de actualizar el componente principal con una función establecida para el elemento secundario con accesorios. Este gancho es para abrir y cerrar el modal para editar un elemento.

 //PARENT FILE //hook const [isEditModalOpen, setEditModalOpen] = useState(false) //more code... //modal {isEditModalOpen && <EditExcerciseModal setEditModalOpen={setEditModalOpen} isEditModalOpen={isEditModalOpen} />}

y este es el codigo hijo

 //CHILD FILE export const EditExcerciseModal = ({setEditModalOpen, excerciseInfo,fetchExcercisesFromRoutine}) //more code etc etc <div className="addExcerciseModalContainer"> <span onClick={() =>{ setEditModalOpen(false) }} className="xModal">X</span>

Lo comprobé y el onClick está funcionando. si cambio el estado principal manualmente, Modal funciona bien y se cierra.

el caso extraño cuando funciona es cuando, en lugar de llamar a la función set, creo una función con un setTimeout sin tiempo como este:

 function closeModal(){ setTimeout(() => { setEditModalOpen(false)}, 0); }

¿algunas ideas? gracias por la ayuda

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Es necesario crear una separación de preocupaciones. Un modal consta de tres partes.

  • El Modal de su Ser.
  • El contenido del modal.
  • Y el contenedor de los dos.

Debería usar el gancho useState() y llamar a setEditModalOpen en el mismo componente que lo contiene.

Debe asegurarse de que está declarando y configurando el estado dentro del mismo componente.

 // children would be the content of the modal const Modal = ({ children, selector, open, setOpen }) => { // we need the useEffect hook so that when we change open to false // the modal component will re-render and the portal will not be created useEffect(() => { setOpen(false); //provide useEffect hook with clean up. return () => setOpen(true); }, [selector]); return open ? createPortal(children, selector) : null; }; export const EditExerciseModal = ({ close }) => { return ( <div> {/* Instead of creating a handler inside this component we can create it in it's parent element */} <span onClick={close}>X</span> {/* Content */} </div> ); }; export const ModalBtn = () => { const [isEditModalOpen, setEditModalOpen] = useState(false); // this is where it all comes together, // our button element will keep track of the isEditModalOpen variable, // which in turn will update both child elements // when true useEffect hook will re-render Modal Component only now it "will" createPortal() // when our EditExerciseModal alls close it will set change the isEditModalOpen to false // which will be passed to the Modal component which // will then cause the component to re-render and not call createPortal() return ( <> <button onClick={() => setEditModalOpen(true)}>EditExerciseModal</button> {setEditModalOpen && ( <Modal open={isEditModalOpen} setOpen={setEditModalOpen} selector={'#portal'}> <div className='overlay'> <EditExerciseModal close={() => setEditModalOpen(false)} /> </div> </Modal> )} </> ); };
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