ReduxにおけるThunkを使用したデータ送信

前回のレッスンでは、偽のサーバーでのPOSTリクエストの処理について学びました。 では、サーバーにリクエストを送信するthunk関数を書いてみましょう。

製品管理アプリケーションを開き、その中のファイルproductsSlice.jsを開きます。 次に、thunk fetchProductsの後で、 createAsyncThunkを使用してthunk addProductを作成します:

products/productsSlice.jsexport const addProduct = createAsyncThunk()

createAsyncThunkの最初のパラメータとして 'products/addProduct'を渡し、2番目のパラメータとして 新しい製品のデータオブジェクトを受け取る非同期コールバックを渡します:

products/productsSlice.jsexport const addProduct = createAsyncThunk(
  'products/addProduct',
  async (newProduct) => {}
)

このコールバックのコード内で、クライアントを呼び出し、 パスと製品オブジェクトをパラメータとして渡し、 応答データを返します:

products/productsSlice.jsexport const addProduct = createAsyncThunk(
  'products/addProduct',
  async (newProduct) => {
    const response = await client.post('/fakeServer/products', newProduct)
    return response.data
  }
)

次に、コードの下の方で、productsSliceの reducersフィールドを見てみましょう。 以前は、reducerメソッドとprepareメソッドを持つ productAddedレデューサーを使用して新しい製品を追加していました。 現在はサーバーで必要なデータを生成し、thunkを扱っているため、 ここから完全にレデューサーproductAddedをコードから削除します。 その後、extraReducersメソッド(そのコードの末尾)に、 もう1つの追加レデューサーを加えます。このレデューサーは、 リクエストが成功した場合、アクションのpayloadから 直接productsスライスに新しい製品を追加します (このようなコードが可能なのは、唯一無二の createSliceのおかげであることを覚えておいてください):

products/productsSlice.js.addCase(addProduct.fulfilled, (state, action) => {
  state.products.push(action.payload)
})

そうそう、忘れずにインポート行からnanoidを削除し、 ファイル末尾のエクスポートアクションからproductAddedを削除してください。

Задание 1

学生管理アプリケーションを開いてください。 その中のファイルstudentsSlice.jsを開きます。 createAsyncThunkを使用して、レッスンで示したように 新しい学生を追加するためにサーバーにPOSTリクエストを送信する 別のthunk addStudentを作成してください。

Задание 2

次に、下の方でstudentsSliceに変更を加えます: reducersプロパティ内のレデューサーstudentAddedを完全に削除します。 そして、extraReducersフィールドに、レッスンで示したように、 リクエストが成功した場合にアクションのpayloadから studentsスライスに新しい学生を追加する追加レデューサーを加えます。