当前位置: 首页 > 面试题库 >

useState设置方法不能立即反映更改

苗信鸥
2023-03-14
问题内容

我正在尝试学习钩子,该useState方法使我感到困惑。我正在将初始值分配给数组形式的状态。useState即使使用spread(...)或,in中的set方法对我也不起作用without spread operator。我已经在另一台PC上创建了一个API,该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或创建的Class组件中的setState,React.PureComponent使用useState钩子提供的更新程序的状态更新也是异步的,不会立即反映出来

同样,这里的主要问题不仅是异步性质,而且函数根据状态的当前闭包和状态更新来使用状态值这一事实将反映在下一次重新渲染中,现有闭包不会受到影响,而是会创建新的闭包
。现在,在当前状态下,挂钩中的值由现有的闭包获取,并且当重新渲染时,将根据是否再次创建函数来更新闭包。

即使添加了一个setTimeout函数,尽管超时将在发生重新渲染的一段时间后运行,但是setTimout仍将使用其先前关闭而不是更新后的值。

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

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

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

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

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

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


 类似资料:
  • 我正在尝试学习挂钩,方法让我感到困惑。我正在以数组的形式为状态分配初始值。中的set方法不适合我,无论是否使用扩展语法。 我在另一台PC上制作了一个API,我正在调用并获取我想要设置为状态的数据。 这是我的代码: 无论是设置电影(结果)还是设置电影(结果)都不起作用。 我希望将

  • 我试图学习钩子,而方法让我感到困惑。我以数组的形式给一个状态赋值初始值。中的set方法不适用于我,无论是否使用扩频运算符。 我在另一台PC上制作了一个API,我正在调用它并获取我想要设置为状态的数据。 这是我的代码: 和都不起作用。 我希望结果变量被推送到movies数组中。

  • 每当我使用useState设置变量时,该值不会立即反映出来。这里我有一个useEffect调用computePriceSummary(); computePriceSummary调用三个函数,如图所示: 这些函数使用useState设置变量: 浏览器中显示的值包括: Stackoverflow中的解决方案建议使用useEffect跟踪变量,因此我做了: 结果还是一样。

  • 问题内容: 我正在做一个待办事项应用程序。这是违规代码的非常简化的版本。我有一个复选框: 这是调用复选框的函数: updateItem是映射为分派到redux的函数 我的问题是,当我调用updateItem操作并在console.log状态时,它总是落后1步。如果未选中该复选框且该复选框不为true,则仍将状态为true传递给updateItem函数。我是否需要调用另一个函数来强制状态更新? 问题

  • 我正在尝试在react中开发todo应用程序。下面是代码。 当我在文本框中输入todo并单击添加时,todo将给出旧值。 例如,如果我输入“a”,则todo数组将给出,然后当我输入“b”时,todo显示。请帮忙。 编辑: 下面的工作

  • 下面是我的代码的一个片段。调用filteredData()时,状态未更新。在状态更新之前,我必须单击按钮两次。这是一个旧项目,我正在使用钩子更新它。我以前在设置状态后使用了回调函数,但我不能用钩子实现。 }