Изменение данных продукта в 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
.