开发者问题收集

我是否正确使用使用效果挂钩来尝试获取数据?

2021-08-27
888

当我尝试使用 useEffect 钩子从 API 获取数据时,我的 React 代码出现了一些问题。

这是我的简化代码:

const App = () => {

    const [ data, setData ] = useState([]);
    const [ loading, setLoading ] = useState(false);

    useEffect(() => {
        
        const loadData = async () => {

            try {
                setLoading(true);
                const response = await fetch(`htts://localhost/api/`);
                const json = await response.json();
                console.log(json);
                setData(json);
                setLoading(false);
            } catch (error) {
                console.log("error: " + error);
            }
        }

        loadData();

    }, []);
}

我遇到了一个问题,当我渲染 html 时,它给出了一些错误,我无法将这些错误映射到我从 API 中设置的某些 data

我当时认为,设置 data 变量将使我能够在模板中吐出数据和各种对象键名,例如:

{
     data.keyname.map((item, index) => {
            return (
                    <option key={ index }
                            value={ item.displayName }
                    >
                    { item.displayName }
                    </option>
            );
    })
}

我是不是忽略了什么?似乎我的数据没有加载,因此渲染代码无法循环遍历渲染应用程序所需的任何数据。

3个回答

如果您尝试映射任何内容以返回您的组件,则必须将其初始化为数组。它是否为空并不重要,但必须始终是一个数组。

因此,我建议您像这样初始化您的“数据”:

    const [ data, setData ] = useState({anyKeyName:[]});
Erfan
2021-08-27

什么是 data.keynamedata 以数组形式开始:

const [ data, setData ] = useState([]);

数组没有 keyname 属性。因此,这将失败并出现错误,指出您无法在 undefined 上调用 .map

data.keyname.map((item, index) => {

如果您从服务器返回的内容预计是一个 对象 ,该对象具有一个名为 keyname 的数组 属性 ,请初始化您的默认对象以匹配该对象:

const [ data, setData ] = useState({ keyname: [] });

基本上,这听起来像您的 useEffect 逻辑正在运行(假设响应是您期望的),但您的初始状态与您期望渲染时的状态不匹配。

David
2021-08-27

添加 可选的链接(?) 是为此的快速和稳固的解决方案。

878049486

详细了解 optional_chaining

Amruth
2021-08-27