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

150
Vistas
El tiempo de espera no borra todas las instancias en React JS

Tengo el siguiente código donde creé un gancho para manejar la función de tiempo de espera. La idea es que, cuando el usuario haga clic en un botón, el mensaje debería aparecer y desaparecer después de un período de tiempo.

 import "./styles.css";
import React, { useRef, useCallback, useState, useEffect } from "react";
const useTimer = () => {
 const timer = useRef();
 const fn = useCallback((callback, timeout = 0) => {
 clearTimeout(timer.current);
 timer.current = setTimeout(() => {
 callback();
 }, timeout);
 }, []);

 const clearTimeoutHandler = () => {
 console.log("clear");
 return clearTimeout(timer.current);
 };

 useEffect(() => {
 return clearTimeoutHandler();
 }, []);

 return { fn, clearTimeoutHandler };
};

export default function App() {
 const [state, setState] = useState(false);
 const [list, updateList] = useState([]);
 const timer = useTimer();

 const removeItem = (id) => {
 updateList((list) => list.filter((x) => x.id !== id));
 timer.clearTimeoutHandler();
 };

 const onClickHandler = () => {
 const id = new Date();

 const element = {
 id: id,
 text: "text" + new Date()
 };

 updateList(list.concat([{ ...list, ...element }]));

 timer.fn(() => {
 removeItem(id);
 }, 2000);
 };

 const bottomMess = () => {
 setState({ m: "hi" });
 timer.fn(
 () => {
 setState(undefined);
 },
 2000
 );
 };

 return (
 <div className="App">
 <button onClick={bottomMess}>Open bottom message</button>
 <button onClick={onClickHandler}>Open top message</button>
 {list.map((d) => (
 <h1>{d.text}</h1>
 ))}
 {state && (
 <div style={{ position: "absolute", bottom: 0 }}>
 bottom message {state.m}
 </div>
 )}
 </div>
 );
}

PROBLEMA: cuando hago clic en el botón Open top message 3 veces, solo desaparece el último mensaje, pero espero que se eliminen todos.
¿Dónde está el problema en el gancho y cómo hacer que el gancho funcione?
demostración: https://codesandbox.io/s/summer-fire-2xw0d5?file=/src/App.js

almost 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Su implementación actual solo realiza un seguimiento del último temporizador. Puede devolver timerId desde fn y aceptar timerId como argumento para la función clearTimeoutHandler :

Prueba así:

 const useTimer = () => {
 const timer = useRef([]);
 const fn = useCallback((callback, timeout = 0) => {
 const timerId = setTimeout(() => {
 callback();
 }, timeout);
 timer.current.push(timerId);
 return timerId;
 }, []);

 const clearTimeoutHandler = (timerId) => {
 return clearTimeout(timerId);
 };

 const clearAll = () => {
 timer.current.forEach((timerId) => clearTimeout(timerId));
 };

 useEffect(() => {
 return clearAll;
 }, []);

 return { fn, clearTimeoutHandler, clearAll };
};

Editar voz-envejecida-tjwtso

almost 4 years ago · Santiago Trujillo 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