javascript - 反应 componentsDidUpdate 与 SetState 回调
问题描述
如果我运行这段代码,我会得到无限循环componentDidMount
,添加 if 语句(prevState !== this.state)
也无济于事。
state = {
purchaseable: false,
totalPrice: 0
}
updatePurchaseState = () => ({
purchaseable: true
});
addIngredientHandler = (type) => {
const newPrice = totalPrice + 1
this.setState({
totalPrice: newPrice
});
}
componentDidUpdate (prevProps, prevState) {
this.updatePurchaseState()
}
但是,如果我updatePurchaseState
在setState
回调中执行一切正常:
addIngredientHandler = () => {
let newPrice = newPrice +1
this.setState(() => ({
totalPrice: newPrice
}), () => this.updatePurchaseState());
}
根据 React 文档https://reactjs.org/docs/react-component.html#setstate componentDidUpdate
是更好的执行方式updatePurchaseState
。
为什么会componentDidUpdate
陷入无限循环,但setState
如果同时更新状态并且应该重新渲染,回调却不会?打电话的最佳方法是updatePurchaseState
什么?
解决方案
每次更新组件的 state 或 props 时,组件都会重新渲染并调用componentDidUpdate
. 所以这两个函数addIngredientHandler
都会updatePurchaseState
触发componentDidUpdate
被调用。在componentDidUpdate
您尝试updatePurchaseState
再次调用时,导致无限循环。
正确执行此操作的方法是componentDidUpdate
,您必须通过将当前状态与先前状态进行比较来检查是否updatePurchaseState
应该调用:
componentDidUpdate (prevProps, prevState) {
if (this.state.purchaseable !== prevState.purchaseable) {
this.updatePurchaseState()
}
}
更多细节请阅读React官方文档
推荐阅读
- postgresql - PostgreSQL 应该在这里使用更多内存吗?
- prestashop - Prestashop 1.7 的自定义 url 路由中的 404 错误
- selenium - 使用 Serenity RestAssured 时出现 noBaseStepListener 错误
- node.js - 当正在运行的容器因任何原因失败时,Kubernetes 是否会重新启动失败的容器或创建新容器?
- node.js - Puppeteer pdf 图像无法正确渲染
- java - eclipse ide中的构建路径不完整
- akka - AKKA 经典多接口连接
- c - 你会如何在 C 中进行咖喱
- java - TreeSet.headSet(someElement).size() 的替代方案,降低了时间复杂度
- c# - 缺少一组特定方法的 Access-Control-Allow-Origin 标头