javascript - 反应 - 功能未执行
问题描述
我不知道为什么这不起作用。当我运行时removeFromCart
,它可以工作,但在updateCount
. 请帮我解决这个问题。
updateCount = (id,increment) => {
const cartItems = this.state.cart;
if((this.findItem(cartItems, id).count == 1 && increment < 0))
this.removeFromCart(id);
else{
this.findItem(cartItems, id).count += increment;
}
this.setState({
cart: cartItems
});
}
removeFromCart = id=>{
const cartItems = this.state.cart.filter(el=> el.id !== id);
this.setState({
cart: cartItems
});
}
findItem = (arr,id)=> {
return arr.find(e=> e.id === id);
}
你可以在Github上找到完整的源代码
解决方案
花了一些时间仔细研究您的代码,显然没有多少错误(除了状态突变),最终我只是将您的 repo 克隆到一个代码沙箱中并进行了调试。
问题
问题是状态更新来自updateCount
和另一个来自removeFromCart
. 条件this.findItem(cartItems, id).count == 1 && increment < 0
为真并被this.removeFromCart
调用,找到购物车项目并将状态更新入队。执行返回updateCount
并且第二个状态更新被排入队列。cartItems
第二次更新用函数范围内的(状态)覆盖第一次。
updateCount = (id, increment) => {
const cartItems = this.state.cart;
if (this.findItem(cartItems, id).count == 1 && increment < 0)
this.removeFromCart(id);
else {
this.findItem(cartItems, id).count += increment;
}
this.setState({
cart: cartItems // <-- State update #2
});
};
removeFromCart = (id) => {
const cartItems = this.state.cart.filter((el) => el.id !== id);
this.setState({
cart: cartItems // <-- State update #1
});
};
解决方案
从购物车中删除商品时,仅将单个状态更新排入队列。将第二个更新塞入正在更新它的逻辑分支中。
updateCount = (id, increment) => {
const cartItems = this.state.cart;
if (this.findItem(cartItems, id).count == 1 && increment < 0)
this.removeFromCart(id);
else {
this.findItem(cartItems, id).count += increment;
this.setState({
cart: cartItems
});
}
};
此时您的代码似乎可以正常运行,但我应该注意,这this.findItem(cartItems, id).count += increment;
在技术上是一种状态突变。后面的一行您至少复制到一个新的状态对象中,这一事实掩盖了这一点。您应该始终避免状态突变。我建议在更新项目计数时进行以下编辑以映射到新的购物车数组。除非您有充分的理由,否则也可以使用===
而不是进行相等比较。==
updateCount = (id, increment) => {
const cartItems = this.state.cart;
if (this.findItem(cartItems, id).count === 1 && increment < 0)
this.removeFromCart(id);
else {
this.setState({
cart: cartItems.map((item) =>
item.id === id
? {
...item,
count: item.count + increment
}
: item
)
});
}
};
推荐阅读
- c# - 遗漏的保留的 MQTT 消息
- html - CSS flexbox:在具有不同内容量的卡片内垂直对齐操作按钮
- php - 从 laravel 8 中的函数使用端点
- javascript - 如何减少表中出现的相同值的多个实例?
- c# - Swagger 显示有条件要求的可为空字段的提示
- c - 使用 c 编程进行二分搜索
- sql-server - Docker - 未设置 MSSQL_COLLATION
- c - WINAPI 中是否有在指定位置绘制单个字符的函数?
- angular - 如何从具有不同事件绑定的组件中抽象出共享 HTML?
- jenkins - 超时时无法捕获 org.jenkinsci.plugins.workflow.steps.FlowInterruptedException