编程语言
首页 > 编程语言> > javascript – useState set方法不会立即反映更改

javascript – useState set方法不会立即反映更改

作者:互联网

我正在尝试学习钩子,useState方法让我感到困惑.我正在以数组的形式为状态分配初始值.即使使用spread(…)或没有spread运算符,useState中的set方法也不适用于我.
我在另一台PC上制作了一个API,我正在调用并获取我要设置为状态的数据.

这是我的代码:

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);

setMovies(result)以及setMovies(… result)不起作用.可以在这里使用一些帮助.提前致谢.

我希望将结果变量推送到movies数组中.

解决方法:

与通过扩展React.Component或React.PureComponent创建的类组件中的setState非常相似,使用useState钩子提供的更新程序的状态更新也是异步的,并且不会立即反映和更新,但会触发重新呈现

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

如果要对状态更新执行操作,则需要使用useEffect钩子,就像在类组件中使用componentDidUpdate一样,因为useState返回的setter没有回调模式

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

就更新状态的语法而言,setMovies(result)将使用异步请求中可用的值替换状态中的先前电影值

但是,如果要将响应与先前存在的值合并,则必须使用状态更新的回调语法以及正确使用扩展语法,如

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

标签:javascript,reactjs,react-hooks
来源: https://codeday.me/bug/20190527/1161502.html