我是否正确使用使用效果挂钩来尝试获取数据?
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.keyname
?
data
以数组形式开始:
const [ data, setData ] = useState([]);
数组没有
keyname
属性。因此,这将失败并出现错误,指出您无法在
undefined
上调用
.map
:
data.keyname.map((item, index) => {
如果您从服务器返回的内容预计是一个
对象
,该对象具有一个名为
keyname
的数组
属性
,请初始化您的默认对象以匹配该对象:
const [ data, setData ] = useState({ keyname: [] });
基本上,这听起来像您的
useEffect
逻辑正在运行(假设响应是您期望的),但您的初始状态与您期望渲染时的状态不匹配。
David
2021-08-27
Amruth
2021-08-27