0

私は 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);
    })
  };
4

1 に答える 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
  })
})
于 2020-01-17T05:22:51.680 に答える