状态变量未使用react钩子进行更新

问题描述 投票:0回答:1

我正在学习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);
    })
  };
reactjs callback react-hooks use-state
1个回答
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
  })
})
© www.soinside.com 2019 - 2024. All rights reserved.