javascript - 为什么 useState 钩子(Hook)在 useEffect() 中使用循环时不更新

标签 javascript node.js reactjs react-hooks mern

情况1:

    const [present, setPresent] = useState([]);
     
    useEffect(() => {
    
        for (var j = 1; j <= totalPeriod; j++) {
          setPresent([
            ...present,
            {
              period: j,
              present: true,
            },
          ]);
        }
    
    }, []);
案例二:

    const [present, setPresent] = useState([]);
    
    let createPresent = [];
    for (var j = 1; j <= totalPeriod; j++) {
      createPresent = [
        ...createPresent,
        {
          period: j,
          present: true,
        },
      ]
    }
    
    useEffect(() => {
      setPresent(createPresent);
    }, []);

当我尝试更新 礼物 在内部使用循环状态 useEffect()在案例 1 中,礼物 状态没有更新。但是当我在 useEffect() 之外单独使用循环时并创建一个数组,然后分配给 礼物 情况 2 中的状态,礼物 状态正在更新。
这背后的原因是什么?为什么礼物 在案例 1 中状态没有更新?

最佳答案

在以下情况下,您的 present state 不是每个后续状态更新的结果,而是您拥有的初始状态,即 [] . React 将 这些更新并没有使它们同步发生,所以只有一个状态更新,present更新到您的 for loop 中的最新条目.

  const [present, setPresent] = useState([]);
     
    useEffect(() => {
    
        for (var j = 1; j <= totalPeriod; j++) {
          setPresent([
            ...present,
            {
              period: j,
              present: true,
            },
          ]);
        }
    
    }, []);
在以下情况下,您首先组装 createPresent包含您需要的所有值的数组,最后调用 状态更新函数setPresent设置状态。
const [present, setPresent] = useState([]);
    
    let createPresent = [];
    for (var j = 1; j <= totalPeriod; j++) {
      createPresent = [
        ...createPresent,
        {
          period: j,
          present: true,
        },
      ]
    }
    
    useEffect(() => {
      setPresent(createPresent);
    }, []);
为了实现第二个行为,您可以使用 状态更新器回调,它保存先前的状态作为参数 像这样:-
  const [present, setPresent] = useState([]);
     
    useEffect(() => {
    
        for (let j = 1; j <= totalPeriod; j++) {
          setPresent(prevState=>[
            ...prevState,
            {
              period: j,
              present: true,
            },
          ]);
        }
    
    }, []);
这里还有状态更新是批量 但是在更新下一个状态之前会考虑以前的状态。
当我说 批量 状态更新,我的意思是只有一个渲染。您可以通过执行 console.log('render') 来验证。在组件的函数体中。
注意 let 的使用而不是 varlet 开始限定范围,您将获得变量 j 的准确值.

关于javascript - 为什么 useState 钩子(Hook)在 useEffect() 中使用循环时不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66560016/

相关文章:

javascript - 如何根据对数要求创建尺寸公式

javascript - 事件对象中的 Source 属性导致渲染失败

mysql - Sequelize : How to multiply column into an aggregate function

javascript - 在浅层渲染的功能组件上调用 instance() 返回 null

javascript - 如何在 React Native 上的 Firebase 中获取特定文档的文档 ID?

javascript - 是否可以在不同浏览器中使用 Redux 中的状态来实现响应性?

javascript - 鼠标悬停在不覆盖整个 Div 的区域上

javascript - 在 Parse 中一次更新多个对象

node.js - 无法运行 Mongodb

android - React Native - 带有新项目的意外标识符 'str'