问题描述
再一次:我在 redux 商店中有项目 -> 包含对象 {id: str,val: bool} 的数组
我想通过 id 更改 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 中是如何完成的吗?
解决方法
逻辑很好,你可以创建包含逻辑的动作。
但是,我不会将 thunk 用于同步操作。我会将逻辑移到 reducer,并为 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
}
}