reactjs - 当我更新子组件的状态变量时,为什么会导致无限循环?
问题描述
我的代码在这里。
我正在创建一个标题详细信息页面,我想在员工详细信息表中显示第一个员工详细信息。
不幸的是,我面临一个奇怪的问题。
为了从服务器获取数据,我需要使用useEffect
钩子,所以我必须将数据保存到staffData
App.js 中的一个状态变量(即)中,然后提交给StaffManagement
组件。
为了在人员详细信息表中显示第一个人员详细信息,我staffDetail
在StaffManagement
组件中创建了一个状态变量。
当我为 state variable 设置一个值时staffDetail
,这意味着以下语句,
setStaffDetail(staff);
浏览器显示以下消息:
Too many re-renders. React limits the number of renders to prevent an infinite loop.
我的组件中没有useEffect
钩子StaffManagement
,为什么会导致无限循环?
解决方案
因为它setStaffDetail
每次渲染。当setStaffDetail
调用它触发渲染时,它setStaffDetail
......你需要将它包装在一个useEffect
useEffect(() => {
for (const [staffId, staff] of Object.entries(staffData)) {
staffList.push(
<tr key={staffId}>
<td>{staff.name}</td>
</tr>
);
if (count === 0) {
setStaffDetail(staff);
}
}
}, [staffData]);
另一种解决方法是使用useRef
const count = useRef(0);
for (const [staffId, staff] of Object.entries(staffData)) {
staffList.push(
<tr key={staffId}>
<td>{staff.name}</td>
</tr>
);
if (count.current === 0) {
count.current++;
setStaffDetail(staff);
}
}
推荐阅读
- coq - 在 Coq 中将 `not A` 转换为 `A -> False`
- collections - Java 8 Map 合并 VS 计算,本质区别?
- python - 如何在 pyspark 中并行下载大量 URL?
- regex - 在 bash 中提取 CGI 查询参数值
- jmeter - 本地系统(一个主 - 零从)和主从系统 - jmeter中的脚本执行有什么区别?有何不同
- java - 在 Java 中使用椭圆曲线的 El Gamal
- java - 来自扩展 TimerTask 的类中的 IntentService
- python - 如何在 BeautifulSoup 中添加“href contains”条件
- sql - 在 bigquery 中编写最小值的优雅而有效的方法
- r - 使用汽车包中的功能时出错