【发布时间】:2019-09-18 13:38:14
【问题描述】:
我试图了解 useState 和 useEffect 钩子在 ReactJs 中是如何工作的。
我收到错误消息
.map() 不是函数
尝试在表格中显示数据时。
const [posts, setPosts] = useState([]);
useEffect(() => {
const alarmService = new AlarmService();
const response = alarmService.getData();
setPosts(response)
}, [])
return (
<table className="table">
<tbody>
{posts.map(data => (
<tr key={data.id}>
<td>
<div className="row">
{data.name}
</div>
</td>
<td className="custom" >
<button
className="btn btn-danger btn-sm"
onClick={() => this.handleDelete(data)}
>
Delete
</button>
</td>
</tr>
))}
</tbody>
</table>
);
我认为问题出在我的useEffect 中,因为我不确定如何处理回复。
已解决
我研究了这些例子: https://www.robinwieruch.de/react-hooks-fetch-data/
诀窍是在 useEffect 中创建一个异步函数。像这样:
useEffect(() => {
async function test() {
const alarmService = new AlarmService();
const response = await alarmService.getData();
console.log(response);
setPosts(response)
}
test();
}, []);
感谢所有花时间回复和帮助的人!
【问题讨论】:
-
你好,请问
const response = alarmService.getData()中的“response”是不是数组? -
刚刚注意到响应是:Promise {
}。在这个承诺中是数组。我假设 .map() 函数需要一个数组,对吗? -
我相信您的问题与反应无关,而是与承诺有关。我假设 getData() 是一个 ajax 调用。这意味着当您执行 setPosts(response) 时,响应是承诺或未定义,因此 map 将不起作用。要绕过这一点,您需要在解决 getData 承诺后执行 setPosts。
-
@JensOlsson 你明白了。只需兑现承诺,您就可以开始了。干杯
-
试试
const response = alarmService.getData().then(res => res.json());
标签: javascript reactjs jsx