Изменение данных продукта в Redux store

Мы научились добавлять продукты, а что если мы захотим изменить информацию о продукте? Давайте рассмотрим как это сделать в этом и последующих уроках.

Откроем наше приложение с продуктами и зайдем в файл productsSlice.js. Начнем с того, что нам нужно для слайса products написать еще один reducer, который будет запускаться при обновлении продукта. Назовем его productUpdated и добавим в поле reducers после редьюсера productAdded. Также передадим ему сразу параметрами state и action, на основе которых, как мы помним, работает редьюсер:

reducers: { productAdded(state, action) { state.push(action.payload) }, productUpdated(state, action) {}, },

Теперь давайте подумаем, какие данные нам понадобятся для обновления продукта. Прежде всего - это id, по нему мы сможем найти интересующий нас продукт в store. Остальные данные - название, описание, цена и количество будут у нас для изменения. Все эти значения мы получим из свойства payload объекта action, который нам придет, и если бы мы писали его руками, то он бы выглядел так, как показано ниже. Заметьте, что ожидаемое значение свойства payload - один аргумент, поэтому мы будем передавать сюда объект (об этом мы поговорим в дальнейшем):

{ type: 'products/productUpdated', payload: {id, name, desc, price, amount} }

Выяснив основные моменты, теперь мы можем написать в фигурных скобочках код для productUpdated. Сначала получим из объекта action измененные данные:

productUpdated(state, action) { const { id, name, desc, price, amount } = action.payload },

Теперь мы найдем по полученному id продукт, который нужно изменить:

productUpdated(state, action) { const { id, name, desc, price, amount } = action.payload const desiredProduct = state.find(product => product.id === id) },

Если такой продукт нашелся в store, то мы заменим его данные новыми значениями:

productUpdated(state, action) { const { id, name, desc, price, amount } = action.payload const desiredProduct = state.find(product => product.id === id) if (desiredProduct) { desiredProduct.name = name desiredProduct.desc = desc desiredProduct.price = price desiredProduct.amount = amount } },

Нам остается только экспортировать action creator для использования в компоненте, который любезно создаст за нас createSlice. Давайте добавим его к экспорту в конце файла, наряду с существующим productAdded:

export const { productAdded, productUpdated } = productsSlice.actions

Откройте ваше приложение со студентами. Изучив материал урока, в файле studentsSlice.js допишите еще один reducer для productsSlice, который будет обновлять данные студента в store в случае их изменения пользователем. Назовите его studentUpdated.

А как бы выглядел в этом случае ваш объект action? Пришлите его код в ответе.

В конце файла экспортируйте полученный action creator studentUpdated.



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