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

175
Vistas
Actualizaciones de estado de reacción solo cuando el componente se vuelve a renderizar

Estoy tratando de incrementar el valor de React state setMoviesPage en 1 cada vez que se llama handleScroll() . El problema al que me enfrento es que el estado setMoviesPage se actualiza solo el componente se vuelve a procesar (al navegar a una URL diferente y regresar).

Este es mi código:

 const [moviesPage, setMoviesPage] = useState(1); async function handleScroll() { if (window.innerHeight + document.documentElement.scrollTop !== document.documentElement.offsetHeight) return; await setIsFetching(true); setMoviesPage(moviesPage + 1); } useEffect(() => { if (!isFetching) return; fetchMovies(String(moviesPage)) .then(prevState => updateMovies([...prevState])) .catch(() => updateMovies([])); setIsFetching(false); }, [isFetching, setIsFetching, moviesPage, updateMovies]);

¿Como arreglarlo? Gracias

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

0

Cuando busqué su código por primera vez, lo que realmente quiero decirle es que su useEffect parece no estar en las mejores prácticas utilizadas.

Aquí lo modifico para ti con mejor estructura.

 const fetchMovie = () => { setIsFetching(true) fetchMovies(String(moviesPage)) .then(prevState => updateMovies([...prevState])) .catch(() => updateMovies([])); setIsFetching(false) } useEffect(() => { fetchMovie }, [moviesPage]);

Y tenga en cuenta que solo necesita agregar la matriz de dependencias para usarEfecto todo el valor cambiado que activará su acción dentro de él. Además, a veces linter puede darte una advertencia de falso positivo.

Espero que esta respuesta pueda ayudarte a resolver tu problema.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Tema

Parece que cuando se completa la búsqueda de películas, simplemente sobrescribe el estado existente.

 fetchMovies(String(moviesPage)) .then(prevState => updateMovies([...prevState])) // <-- overwrite state .catch(() => updateMovies([]));

Con los componentes de función y el useState , las actualizaciones de estado no se fusionan con el estado existente, debe administrar esto manualmente.

Nota

A diferencia del método setState que se encuentra en los componentes de clase, useState no fusiona automáticamente los objetos de actualización. Puede replicar este comportamiento combinando el formulario de actualización de funciones con la sintaxis de distribución de objetos:

 const [state, setState] = useState({}); setState(prevState => { // Object.assign would also work return {...prevState, ...updatedValues}; });

Solución

Actualice el valor de moviesPage en el controlador de desplazamiento

 function handleScroll() { if (window.innerHeight + document.documentElement.scrollTop !== document.documentElement.offsetHeight) return; setMoviesPage(moviesPage + 1); }

Factorice la lógica de obtención en una función de utilidad. Use una actualización de estado funcional para actualizar desde el estado anterior, agregando los nuevos datos a una nueva referencia de matriz. Mueva el restablecimiento del estado de carga a la cadena Promise para que se restablezca correctamente al final de la cadena; de lo contrario, simplemente cancelaría la actualización verdadera de inicio de carga.

 const fetchNextMoviesPage = (page) => { if (!isFetching) { setIsFetching(true); // <-- start loading fetchMovies(String(page)) .then(nextPage => { updateMovies(movies => movies.concat(nextPage)); // <-- append next page }) .catch(() => updateMovies([])) .finally(() => setIsFetching(false)); // <-- end loading } }; useEffect(() => { fetchNextMoviesPage(moviesPage); }, [moviesPage]);
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