javascript reactjs react-hooks

javascript - El método de configuración de useState no refleja el cambio inmediatamente



reactjs react-hooks (1)

Estoy tratando de aprender ganchos y el método useState me ha confundido. Estoy asignando valor inicial a un estado en forma de una matriz. El método de configuración en useState no funciona para mí, incluso con spread(...) o without spread operator . He creado una API en otra PC a la que llamo y obtengo los datos que deseo configurar en el estado.

Aquí está mi código:

import React, { useState, useEffect } from "react"; import ReactDOM from "react-dom"; const StateSelector = () => { const initialValue = [ { category: "", photo: "", description: "", id: 0, name: "", rating: 0 } ]; const [movies, setMovies] = useState(initialValue); useEffect(() => { (async function() { try { //const response = await fetch( //`http://192.168.1.164:5000/movies/display` //); //const json = await response.json(); //const result = json.data.result; const result = [ { category: "cat1", description: "desc1", id: "1546514491119", name: "randomname2", photo: null, rating: "3" }, { category: "cat2", description: "desc1", id: "1546837819818", name: "randomname1", rating: "5" } ]; console.log(result); setMovies(result); console.log(movies); } catch (e) { console.error(e); } })(); }, []); return <p>hello</p>; }; const rootElement = document.getElementById("root"); ReactDOM.render(<StateSelector />, rootElement);

El setMovies(result) así como setMovies(...result) no funciona. Podría necesitar algo de ayuda aquí. Gracias por adelantado.

Espero que la variable de resultado se introduzca en la matriz de películas.


Al igual que los componentes de setState en clase creados al extender React.Component o React.PureComponent , la actualización de estado usando el actualizador proporcionado por useState hook también es asíncrono, y no se reflejará ni actualizará inmediatamente, pero activará una nueva representación.

setMovies(result); console.log(movies) // movies here will not be updated

Si desea realizar una acción en la actualización de estado, debe usar el gancho useEffect, al igual que el uso de componentDidUpdate en componentDidUpdate de clase, ya que el establecedor devuelto por useState no tiene un patrón de devolución de llamada

useEffect(() => { // action on update of movies }, [movies]);

En lo que respecta a la sintaxis para actualizar el estado, setMovies(result) reemplazará el valor de las movies anteriores en el estado con los disponibles en la solicitud asíncrona

Sin embargo, si desea combinar la respuesta con los valores existentes previamente, debe usar la sintaxis de devolución de llamada de la actualización de estado junto con el uso correcto de la sintaxis de propagación, como

setMovies(prevMovies => ([...prevMovies, ...result]));