Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

155
Views
SetInterval "Apilamiento" uno encima del otro

Estoy trabajando en este proyecto que usa setInterval y tengo algunos problemas para entender cómo funciona setInterval. El problema que tengo es que cada vez que llamo a setInterval, la función parece apilarse una encima de la otra, lo que hace que el objeto aparezca varias veces rápidamente. No estoy seguro de lo que estoy haciendo mal en este caso. Alguien me puede ayudar gracias.

 const [hit, setHit] = useState(0) const [count, setCount] = useState(0) var timer = null var funcCalls = 0 const hitSound = new Audio("/hit.wav") useEffect(()=>{ timer = setInterval(moveSquare, 2000) },[]) function handleHit(){ hitSound.play() setHit(hit+1) resetSquare() } function resetSquare(){ clearInterval(timer) moveSquare() timer = setInterval(moveSquare, 2000) } function moveSquare(){ const gameContainer = document.getElementById("game-container") const height = gameContainer.offsetHeight const width = gameContainer.offsetWidth const square = document.getElementById("square") square.style.top = (Math.random() * (height - 100)) + "px"; square.style.left = (Math.random() * (width - 100)) + "px"; } return ( <> <section className='game-section'> <div className='counter'> {hit} {count} </div> <div className='game-container' id = "game-container"> <div className="square" id = "square" onClick={handleHit}></div> </div> </section> </> )
about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Es porque el valor del timer no se guarda en los renderizados, por lo que no puede cancelarlo.

 var timer = null // <-- no const [timer, setTimer] = useState(null) // <-- yes ... // later in useEffect() and resetSquare() // save the timer using setTimer(timer)
about 4 years ago · Juan Pablo Isaza Report

0

La razón de eso está en otra parte: su componente (y/o y de su padre) se recrea. En general, hay algunas razones, pero es difícil señalar una línea de código específica sin depurar:

  • Cualquier representación condicional (p. ej., mostrar el control giratorio durante la solicitud y después de representar el elemento con elementos secundarios de nuevo)
  • O se proporciona un apoyo key diferente
  • O, por error, coloca la declaración del componente (función o clase o ajuste en HOC) dentro del código de representación de otro componente y cada vez que se vuelve a representar el padre, la declaración del componente se vuelve referencialmente diferente

Otra causa raíz: su useEffect no tiene limpieza. Mientras debería. E incluso sin una primera razón, no tendría múltiples temporizadores simultáneos, pero aún tendría un temporizador que no se detendría cuando esté navegando.

 useEffect(()=>{ timer = setInterval(moveSquare, 2000) return () => clearInterval(timer); },[])

Más información sobre limpieza en documentos oficiales:https://reactjs.org/docs/hooks-effect.html#effects-with-cleanup

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!