在 React 的 useEffect() 中获取数据 returns "undefined"

Fetching data in React's useEffect() returns "undefined"

我正在尝试从数据库中获取数据。这是一个获取请求。只要我在异步函数中使用获取的数据,一切正常。但除此之外,它只是 returns "undefined"。 我究竟做错了什么? 感谢您的帮助:)

const [accountInfos, setAccountInfos] = useState();
      const [error, setError] = useState();
      const [loading, setLoading] = useState(true);

      useEffect(() => {
        (async function runEffect() {
            const fetchedAccountInfos =  await fetchAccountInfos();
            if (fetchedAccountInfos && fetchedAccountInfos.length > 0) {
                console.log(fetchedAccountInfos)  //This console.log works
                setAccountInfos(fetchedAccountInfos);
                setLoading(false);
                console.log(accountInfos)  //This console.log returns 
                                             "undefined"
              } else {
                setError("Accountdaten können nicht geladen werden!");
                setLoading(false);
                };
        })();
      }, []);
      console.log(accountInfos);  //This console.log returns "undefined"

你没有做错什么,useEffect 之外的 console.log 只执行一次,在初始组件函数调用时,所以那时 accountInfos 变量仍然未定义。

但是useEffect里面的console.log是在取数据之后执行的,所以是那个时候定义的

试试看效果?

      const [accountInfos, setAccountInfos] = useState();
      const [error, setError] = useState();
      const [loading, setLoading] = useState(true);

      useEffect(() => {
        (async function runEffect() {
            const fetchedAccountInfos =  await fetchAccountInfos();
            if (fetchedAccountInfos && fetchedAccountInfos.length > 0) {
                setAccountInfos(fetchedAccountInfos);
                setLoading(false);
                console.log(accountInfos)  //This console.log works
              } else {
                setError("Accountdaten können nicht geladen werden!");
                setLoading(false);
                };
        })();
      }, []);
      console.log(accountInfos);  //This console.log returns "undefined"

      useEffect(() => {
        console.log(accountInfos); //check the result here
      }, [accountInfos])

它不是特定于 React 的:它是一个异步函数,所以承诺将在控制台日志出现后解析,这就是你得到 undefined 的原因。这只是正常的 JS 行为——值 在 console.log 执行时未定义。

在定义 JSX 的 return 值中,如果 accountinfos 为 null,则渲染 null(或一些空状态组件),否则渲染基于 return 的实际组件来自 API 的值。收到响应后,状态将更新并且组件将重新呈现

为了获取更新后的值然后根据该值执行一些操作,您需要使用 useEffect 钩子

例如

const [toggle, setToggle] = useState(false);

useEffect(() => {
   // do something based on new value of toggle
}, [toggle]);

const trigger = () => {
  setToggle(true);
  // OR
  //setToggle(t => !t);
}

由于大多数答案已经说明了问题的原因,即 JS 的异步特性。 解决此问题的方法是简单地使用条件语句或三元运算符。

const [accountInfos, setAccountInfos] = useState();
  const [error, setError] = useState();
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    (async function runEffect() {
        const fetchedAccountInfos =  await fetchAccountInfos();
        if (fetchedAccountInfos && fetchedAccountInfos.length > 0) {
            console.log(fetchedAccountInfos)  //This console.log works
            setAccountInfos(fetchedAccountInfos);
            setLoading(false);
            if(accountInfos){
                //console the output only if available
                 console.log(accountInfos);
            }
          } else {
            setError("Accountdaten können nicht geladen werden!");
            setLoading(false);
            };
    })();
  }, []);
  console.log(accountInfos);  //This console.log returns "undefined"

如果渲染组件并在 useEffect 挂钩中获取一些数据,同样的方法很有用。

{
   dataIsReturned ? <RenderYourData/> : <h1> Loading </h1>
}