开发者问题收集

React-无法访问 useEffect 钩子之外获取的数据

2022-09-02
807

我正在尝试使用 useEffect 钩子和 fetch API 从我在 React 中创建的 NodeJS 服务器中获取数据。问题是我无法在 useEffect 回调之外访问这些数据 这是我的代码:

import React, { useEffect, useState } from "react";

const App = () => {
  const [LCS_Data, setLCSData] = useState({});

  useEffect(() => {
    fetch("http://localhost:5000/lcs")
      .then((response) => {
        return response.json();
      })
      .then((data) => {
        console.log(data);
        console.log(data.LCS.info);
        setLCSData(data);
      });
  }, []);

  // console.log(LCS_Data.LCS.info);

  return <div className="main"></div>;
};

export default App;

这是 useEffect 中两个 console.log 的输出: 浏览器中第一个 console.log 的输出

所以一切都正常,数据的结构应该如此,没有以任何方式损坏

直到我在 return 语句之前取消对 console.log 的注释

它抛出这个 错误

TypeError: Cannot read properties of undefined (reading 'info')

指向最后一个 console.log,而数据显然在那里。

我如何访问我的数据对象内的属性超出了 useEffect 钩子的范围,因此我通常可以在我的应用程序中使用它

1个回答

在第一次渲染中, LCS_Data 具有您在 useState ( { ) 中提供的值。 useEffect 仅在渲染后运行,因此当我们到达您的 console.log 时,从 { 访问 .LCS.info 会出现错误。只有在 setLCSData(data) 触发重新渲染后,当 fetch 调用返回时, LCS_Data 才会成为从 API 返回的值。因此,在这种情况下,您可以:

  1. 将默认值(如 { LCS: { info: 'default info' } )传递给 useState,以便在 useEffect 运行并且 fetch 调用返回之前,您有一个要打印出来的 LCS_Data.LCS.info 值。

  2. 如果还没有值,请使用可选链 ( LCS_Data.LCS?.info ) 打印出 undefined

请注意,它应该这样工作:在 useEffect 触发并且 fetch 调用返回之前,您不会从服务器获得该值。您应该做的是在发生这种情况之前提供一个默认值。

wai
2022-09-04