[英]Why my component doesn't rerender when context is updated?
我想在从 API 获取数据后呈现一个表,我使用 Context API 和自定义钩子来更新上下文。 我知道我的钩子正在工作,因为第二个 useEffect 记录了数据。 我知道 React 中的状态更新是异步的,但我认为上下文的更改会触发重新渲染。
import React, { useEffect, useContext } from "react";
import { titleCase } from "title-case";
import dataContext from "../../context/dataContext";
const fetchUsers = async (url:string) => {
const response = await fetch(url);
return response.json();
};
const Table = () => {
const {data, setData } = useContext(dataContext);
useEffect(() => {
fetchUsers(`https://randomuser.me/api/?results=50`).then(
(res) => {setData([...data, res.results]) ;
}
)
}, [])
useEffect(() => {
console.log(data)
}, [data])
return (
<table>
<thead>
<tr>
<th>
Name
</th>
<th>
Gender
</th>
<th>
Birth
</th>
<th>
Actions
</th>
</tr>
</thead>
<tbody>
{data.length >0 && data.map((user: Record<string, any>, index: number) => {
const dob = new Date(user.dob.date);
return (
<tr>
<td>
{`${titleCase(user.name.first)} ${titleCase(user.name.last)}`}
</td>
<td>
{titleCase(user.gender)}
</td>
<td>
{dob.toLocaleDateString()}
</td>
<td>
<button>View</button>
</td>
</tr>
);
})}
</tbody>
</table>
);
};
export default Table;
您发布的代码存在多个问题。
res.results
。 如果不这样做,用户数组将存储为单个对象,而不是存储所有多个用户对象。 setData([...data, ...res.results)
login.uuid
字段作为键。 <tr key={user.login.uuid}>
data
作为useEffect
挂钩的依赖useEffect
。我做了一个简单的demo,它遵循了以上几点。 在演示中,我没有使用上下文。 我每 10 秒获取 2 个新用户,然后用他们的电子邮件更新表格。 演示链接。
我知道这是一篇迟到的帖子,但我花了一些时间研究这个,并认为这可能对你有帮助。 希望你现在已经解决了你的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.