Отправка данных с помощью thunk в Redux

На прошлом занятии мы разобрались с обработкой POST-запроса на нашем фейковом сервере. Давайте теперь напишем thunk-функцию, которая будет отправлять запрос на сервер.

Откроем наше приложение с продуктами, а в нем файл productsSlice.js. Теперь после thunk fetchProducts мы с помощью createAsyncThunk создадим thunk addProduct:

export const addProduct = createAsyncThunk()

Первым параметром мы передадим в createAsyncThunk 'products/addProduct', а вторым асинхронный callback, который будет принимать объект с данными нового продукта:

export const addProduct = createAsyncThunk( 'products/addProduct', async (newProduct) => {} )

В коде этого колбэка мы вызовем клиента, передав ему параметрами путь и объект с продуктом, а затем вернем данные ответа:

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

Теперь ниже в коде посмотрим на поле reducers для productsSlice. Раньше мы добавляли новый продукт с помощью редьюсера productAdded, в котором у нас были методы reducer и prepare. Теперь мы генерируем необходимые данные на сервере и работаем с thunk, поэтому уберем здесь полностью редьюсер productAdded из кода. А затем внесем в в метод extraReducers (в конец его кода) еще один дополнительный редьюсер, который в случае успешного запроса будет добавлять в слайс products новый продукт прямо из payload экшена (помним, что такой код возможен только благодаря неповторимому createSlice):

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

Да, кстати, не забудьте убрать nanoid из строчек с импортом, а productAdded из экспорта экшенов в конце файла.

Откройте ваше приложение со студентами. Откройте в нем файл studentsSlice.js. При помощи createAsyncThunk создайте еще один thunk addStudent, который будет отправлять POST-запрос на сервер, чтобы добавить нового студента, как показано в уроке.

Далее ниже внесите изменения для studentsSlice: уберите полностью редьюсер studentAdded в свойстве reducers. А в поле extraReducers добавьте дополнительный редьюсер, который будет добавлять нового студента в слайс students из payload экшена в случае успешного запроса, как показано уроке.



Чат с GPT Компилятор