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

88
Vistas
¿Por qué solo el componente de la función React por primera vez obtiene accesorios?

Reaccionar arroja un error cuando intentamos actualizar el estado en un componente desmontado. Entonces, cuando pruebo el componente de reacción para eso, obtengo errores solo en el primer renderizado.

Hice un componente que habilita el componente secundario en función del clic. Y el componente secundario tiene un botón que actualiza el estado después de un tiempo de espera establecido que arroja una advertencia de reacción

Advertencia: no se puede realizar una actualización de estado de React en un componente desmontado. Esto no es operativo, pero indica una pérdida de memoria en su aplicación. Para solucionarlo, cancele todas las suscripciones y tareas asincrónicas en una función de limpieza useEffect.

Lo cual es perfectamente válido. Pero para superar esto, paso habilitar accesorios del componente principal en función de que existe una condición justo antes de establecer el tiempo de espera en el componente secundario. Entonces, ¿por qué arroja un error solo la primera vez?

Reproducir

Haga clic en el botón del componente secundario que es false y haga clic en el botón del componente principal enable desmonta el componente secundario.

** Mi pregunta es ¿por qué reaccionar arroja un error solo la primera vez? Y por qué funciona bien la segunda vez **

Componente principal

 import { useState } from "react"; import "./styles.css"; import { Test } from "./Test"; export default function App() { const [state, setstate] = useState(true); const changeState = () => { setstate(!state); }; return ( <div className="App"> <button onClick={changeState}>enable </button> {state && <Test enable={state} />} </div> ); }

Componente hijo

 import React, { useState } from "react"; export const Test = (props) => { const [state, setstate] = useState(false); const fetchData = () => { setstate(!state); if (props.enable) { setTimeout(() => { setstate(false); }, 1000); } }; return ( <> <button onClick={fetchData}> {`${state}`}</button> </> ); };

Enlace de Codesandbox para probar

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

0

Buena pista, solo te falta un punto menor, cuando escribes un estado que necesita algo de tiempo para ejecutarse y al mismo tiempo podemos visitar el flujo una y otra vez en función de cualquier acción, entonces necesitamos borrar la suscripción anterior antes de ir a la nueva una...

Por ejemplo, en su código aquí, actualiza el flujo de estado, pero el flujo de estado registra una nueva suscripción cada vez que visitamos un componente con accesorios válidos y hacemos clic en el botón, de modo que la ejecución anterior aún puede funcionar cuando activa un nuevo evento, así que simplemente, lo que tenemos que hacer es desmontar la suscripción anterior y podemos hacerlo con esto para su caso:

 import React, { useState, useEffect } from "react"; export const Test = (props) => { const [state, setstate] = useState(false); useEffect(() => { if (props.enable) { const timer = setTimeout(() => { setstate(false); }, 1000); return () => clearTimeout(timer); } }, [state, props.enable]); const fetchData = () => { setstate((prev) => !prev); }; return ( <> <button onClick={fetchData}> {`${state}`}</button> </> ); };

Mire el código anterior, simplemente agregamos el código necesario para la limpieza en efecto, que se ve en mi estado y apoyo, ahora cuando hago clic en el botón, el efecto se activará, si lo hacemos nuevamente, clearTime funcionará para la suscripción anterior y luego añadir uno nuevo y así sucesivamente...

Notas:

  1. En su caso, podemos eliminar la función y usar setState directamente en su botón.
  2. Prefiere usar useCallBack en su función como const fetchData = useCAllback...
  3. Puedes usar setstate((prev) => !prev); funcionará como una instantánea, y será útil cuando dependa de un valor antiguo... pero puede que no sea necesario en algunos casos también, sino solo para conocer esta función.

Actualización 1:

Qué es la suscripción:

Puede decir que la suscripción representa un recurso desechable, como la ejecución de un Observable. Una suscripción tiene un método importante, darse de baja, que no acepta argumentos y simplemente desecha el recurso que tiene la suscripción; en otras palabras, puede decir que sí, se invocará cualquier tarea asíncrona o cualquier trabajo para reaccionar al estado del ciclo de vida y es necesario para observar los cambios, luego habla de suscripción, como API o tiempo de espera o intervalo de tiempo, etc., cualquiera de estas acciones debe borrar la suscripción previa (detener observador - cancelar suscripción) para evitar cualquier pérdida de memoria y borrar la memoria para mantener el flujo de estado seguro y evita el enrojecimiento innecesario.

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