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

101
Views
useEffect() sin una función de limpieza

dice que: "Cada vez que nuestro componente se renderiza, se llama a nuestro efecto, agregando otro detector de eventos. Con solo unos pocos clics y re-procesadores, ¡hemos adjuntado muchos detectores de eventos al DOM! Necesitamos limpiar después ¡Nosotros mismos!".

entonces, por cada clic, el conteo va de 1 a 3 a 7 en lugar de incrementarse en 1. No entiendo cómo se conectaron tantos detectores de eventos y cómo afecta esto al conteo total.

 import React, { useState, useEffect } from 'react'; export default function Counter() { const [clickCount, setClickCount] = useState(0); const increment = () => { setClickCount(prev => prev + 1); }; useEffect(() => { document.addEventListener('mousedown', increment); }) return ( <h1>Document Clicks: {clickCount}</h1> ); }
about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Está agregando un oyente al documento en sí , por lo que debe eliminarlo cuando se desmonta el componente.

Y necesita agregar una matriz de dependencia vacía para no agregar un nuevo oyente en cada renderizado

Y necesita envolver increment en un useCallback o usar una función de incremento diferente en el useEffect :

 import React, { useState, useEffect } from 'react'; export default function Counter() { const [clickCount, setClickCount] = useState(0); const increment = useCallback(() => { setClickCount(prev => prev + 1); }, [setClickCount]); useEffect(() => { document.addEventListener('mousedown', increment); return () => document.removeEventListener('mousedown', increment); }, []) return ( <h1>Document Clicks: {clickCount}</h1> ); }
about 4 years ago · Juan Pablo Isaza Report

0

Sin usar una matriz de dependencias, cada cambio activará su useEffect para que se ejecute nuevamente.

Entonces, cada renderizado, cada cambio de estado hará que crees otro eventListener .

Hablemos de la variante useEffect :

 useEffect(() => { // invoking on every re-render })
 useEffect(() => { // invoking on component did mount (once) }, [])
 useEffect(() => { // invoking on component did mount and with every change on counter }, [counter])

Además, debe eliminar su eventLinstener en el desmontaje del componente:

 useEffect(() => { document.addEventListener('mousedown', increment); return () => document.removeEventListener('mousedown', increment); }, [])

Opcional

Como se mencionó con Samathingamajig en las respuestas, puede usar una forma optimizada de definir su función de increment con useCallback .

Con la implementación actual, su método increment se redefinirá cada vez (con cada cambio y renderizado), pero al usar useCallback se redefinirá solo cuando la matriz de dependencias de useCallback tenga cambios.

 import React, {useEffect, useCallback} from 'react'; // rest of the codes ... const increment = useCallback(() => { setClickCount(prevState => prevState + 1); }, [setClickCount]);
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!