React中使用useState存储GET请求响应触发无限循环如何解决?
问题原因
- 你的
useEffect没有传入第二个依赖数组参数,React中未指定依赖的useEffect会在每一次组件渲染完成后都执行。 - 调用
setCompany会更新组件状态,触发组件重新渲染,重渲染后又会执行useEffect调用send()函数,send()里再次调用setCompany触发重渲染,就此形成无限循环。 - 你不调用
setCompany时状态不会更新,组件不会触发重渲染,因此不会出现循环问题,完全匹配你遇到的现象。
解决方案
根据你的业务需求选择对应方案即可:
方案1:仅组件首次挂载时发一次请求
给useEffect添加空依赖数组,空数组代表仅在组件首次挂载完成后执行一次:
useEffect(() => { send(); }, []);
方案2:id变化时自动重新请求数据
给useEffect的依赖数组添加id变量,只有id发生变化时才会重新执行请求逻辑:
useEffect(() => { send(); }, [id]);
方案3:仅点击搜索按钮时发请求(更适配你当前的表单逻辑)
你当前写了搜索表单,仅需要用户点击搜索按钮时触发请求的话,直接删除无用的useEffect,把send()调用放到handleSubmit函数中即可:
const handleSubmit = (e) => { e.preventDefault(); send(); }
额外优化建议
你初始化company状态时默认值是空数组[],如果后端返回的公司数据是对象格式,会存在类型不匹配问题,建议修改初始值为null或者符合CompanyModel类型的默认结构,避免后续渲染时报类型错误。
内容的提问来源于stack exchange,提问作者Daniel R
相关产品推荐
相关产品推荐

