#reactjs #redux
Вопрос:
Еще раз: у меня есть элементы в магазине redux -> массив, содержащий объекты {id: str, val: bool}
Я хочу изменить значение obj по идентификатору, я сделал это таким образом, это работает, но я думаю, что я слишком усложнил:
export const setItems = items => {
return {
type: SET_DATA,
payload: items
}
}
export const changeItem = id => {
return (dispatch, getState) => {
let cpItems = getState().items.items.map( el => // creating copy
id === el._id ? {...el, val: !el.val} : el
)
dispatch(setItems(cpItems)) //sending copy
}
}
и редуктор:
const itemsReducer = (state = initialState, action) => {
switch (action.type){
case SET_DATA:
return {
...state,
items: action.payload
}
default: return state
}
}
вот как это делается в redux ?
Ответ №1:
Логика в порядке, и вы можете создавать действия, содержащие логику.
Однако я бы не стал использовать удар для действия синхронизации. Я бы перенес логику в редуктор и создал определенный тип действия для changeItem
:
export const changeItem = id => ({
type: CHANGE_ITEM,
payload: id
})
const itemsReducer = (state = initialState, action) => {
switch (action.type) {
case SET_DATA:
return {
...state,
items: action.payload
}
case CHANGE_ITEM:
return {
...state,
items: state.items.map(el => // creating copy
id === el._id ? {...el, val: !el.val} : el
)
}
default:
return state
}
}