【问题标题】:React render state not the real state反应渲染状态不是真实状态
【发布时间】:2021-11-20 08:24:19
【问题描述】:

我尝试在一秒钟后将我的arr的加载设置为false。但是html中的渲染功能似乎与react dev工具中的状态不一样。 这是代码和截图。

import { useEffect, useState } from 'react';

const App = (p: any) => {
  console.log('render!!');
  const [arr, setArr] = useState([{}, {}, {}, {}]);

  useEffect(() => {
    changeArr();
  }, []);

  const changeArr = async () => {
    const localArr = JSON.parse(JSON.stringify(arr));
    for (let i = 0; i < 4; i++) {
      const p = new Promise(res => {
        setTimeout(() => {
          res('');
        }, 1000);
      });
      const res = await p;
      localArr[i].loading = false;
      setArr(localArr);
    }
  };

  return (
    <>
      <div>{JSON.stringify(arr)}</div>
    </>
  );
};

export default App;

snipaste

【问题讨论】:

    标签: reactjs asynchronous async-await promise


    【解决方案1】:

    你应该使用then 来获得承诺的结果

    import { useEffect, useState } from "react";
    
    const App = () => {
      const [array, setArray] = useState([{}, {}, {}, {}]);
    
      useEffect(() => {
        changeArray();
      }, []);
      function myPromise() {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            resolve("");
          }, 1000);
        });
      }
    
      async function changeArray() {
        JSON.parse(JSON.stringify(array));
        for (let i = 0; i < 4; i++) {
          await myPromise().then(() => {
            const newArray = [...array];
            newArray[i].loading = false;
            setArray(newArray);
          });
        }
      }
    
      return (
        <>
          <div>{JSON.stringify(array)}</div>
        </>
      );
    };
    
    export default App;
    

    【讨论】:

    • 看来你没听懂我说的。你可以看看我的截图。你给出的代码是有效的,因为你使用了const newArray = [...newArray]。你创建了一个浅拷贝数组状态。但我不知道为什么开发工具中的状态与我在组件中返回的状态不兼容,这在我的截图中显示。
    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 2021-08-09
    • 2021-02-09
    • 2022-06-28
    • 2019-11-19
    • 2020-10-07
    相关资源
    最近更新 更多