我正在学习ReactJS,并尝试使用子组件中成分的更新状态来更新父道具。会调用setUserIngredients并将更新的成分传递给父级。
代码:
const [userIngredients, setUserIngredients] = useState([]);
const removeIngredientHandler = id => {
setLoading(true);
fetch(`https://***************.com/ingredients/${id}.json`,{
method:'DELETE'
}).then(response=>{
setLoading(false);
setUserIngredients(prevIngredients =>
prevIngredients.filter(ingredient =>{
return (ingredient.id !== id)
//return ingredient;
})
);
**props.ingredients(userIngredients);**
//userIngredients is still having old value
//need to check on this
}).catch(error => {
setError(error.message);
})
};
答案 0 :(得分:0)
问题在于userIngredients
是在组件渲染时创建的变量,设置为该组件渲染时的状态版本。当您启动异步操作(如提取)时,传递给该操作的回调将绑定创建该回调时的值。
这里的修复非常简单。在计算新成分的地方,只需执行所需的任何回调,然后返回要存储在状态中的值即可。
类似的东西:
fetch(`https://***************.com/ingredients/${id}.json`, {
method: 'DELETE',
}).then(response => {
setLoading(false)
setUserIngredients(prevIngredients => {
// Figure out the new ingredients
const newIngredients = prevIngredients.filter(ingredient => ingredient.id !== id)
// Call your callback with the new ingredients
props.ingredients(newIngredients)
// Return the new ingredients to be stored in your state
return newIngredients
})
})