reactjs - 反应钩子无法在未安装的组件中执行设置状态
问题描述
const SideAd = () => {
const [sideAd, setSideAd] = useState([])
useEffect(() => {
query()
}, [])
const query = async () => {
const res = await getSideAd()
Array.isArray(res) && setSideAd(res)
}
return (
<div className="sideAdComponent">
</div>
)
}
我只想在挂载时提出请求,然后设置一个新状态。但是我得到了错误react hook cant perform setstate in an unmounted component
解决方案
你可以在这里做两件事。
首先是useEffect
使用清理函数来对抗竞争条件(useEffect
回调中的返回值)
const SideAd = () => {
const [sideAd, setSideAd] = useState([])
useEffect(() => {
const isMounted = true;
getSideAd().then(res => Array.isArray && isMounted && setSideAd(res))
return () => {isMounted = false;}
}, [])
return (
<div className="sideAdComponent">
</div>
)
}
查看hackernoon上的好文章以获得更详细的解释。在我看来,这种方法比取消请求更好(因为它不需要您修改请求者的代码)。
另一件事:也许最好在响应到来之前检查组件卸载的原因。这可能是有正当理由的(例如,您已经离开而响应尚未到来)。
但也有可能有一些 HOC 内联声明组件构造函数,这会导致重新创建所有子树而不是更新。因此值得花一些时间进行调查 - 因为可能存在您尚未发现的隐藏错误(示例)。
推荐阅读
- json - 有没有办法将字符串转换为函数?(从 API 获取代码)
- python - 在 python/Tkinter 中显示来自 URL 的图像
- javascript - 如何在 JavaScript 中单击带有事件的按钮?
- javascript - 设置强制 CSS 在 JavaScript 之前加载
- flutter - 如何在使用 http.post 时进行小部件测试
- javascript - 重试在 componentdidmount 中加载两个脚本
- c++ - 在 QGraphicsScene 上绘制 QGraphicsItem 的正确方法
- javascript - JavaScript 脚本不能同时工作,即使它们彼此无关
- python-3.x - Python:使用 pd.concat 联合多个数据框表
- ios - XCTest - 在自定义坐标上使用捏合手势使用 XCUIElement 进行 UI 测试?