【发布时间】:2018-06-26 03:21:40
【问题描述】:
许多链接和教程建议将 action creators 中的逻辑分组,以简化 reducer 逻辑。
想象一个简单的(标准化)状态:
const initialState = {
parent: {
allIds: [0],
byId: {
0: {
parentProperty: `I'm the parent`,
children: [1, 2]
}
}
},
children: {
allIds: [1, 2],
byId: {
1: {
childrenProperty: `I'm the children`
},
2: {
childrenProperty: `I'm the children`
}
}
}
}
我现在要删除父级。由于只有父母指的是孩子,所以我也会删除孩子。
我想像这样的动作创建者:
function deleteParents(parentId) {
return {type: 'DELETE_PARENT', payload: {parentId}};
}
和
function deleteChild(childId) {
return {type: 'DELETE_CHILD', payload: {childId}};
}
现在,为了处理这种情况,我做了这样的事情(使用 redux-thunk)
function deleteParentAndChildren(parentId) {
return (dispatch, getState) {
const childrenIds = myChildrenSelector(getState(), parentId);
const deleteChildrenActions = childrenIds.map(deleteChild);
const deleteParentAndChildrenAction = batchActions([
deleteParents(parentId),
...deleteChildrenActions
], 'DELETE_PARENT_AND_CHILDREN');
dispatch(deleteParentAndChildrenAction);
}
}
这样,我将小动作组合成大动作,而reducer逻辑非常简单,因为它只包含删除对象中的一个键。
相反,我不喜欢使用 redux-thunk(用于异步操作)来获取状态(这被认为是反模式)。
你们是如何处理这类问题的? 像 redux-sage 这样的工具有帮助吗?
【问题讨论】:
-
您能更清楚地说明您要达到的目标吗?所以你想要一种方法来删除父级和所有相应的子级?
-
没错,很抱歉不清楚。我也会保留很少(和可组合的)动作
-
您是否考虑过重新评估您的数据结构?我会考虑将父键和子键作为数组,其中包含对象。每个对象都有它的结构和一个引用 ID。父对象可以有一个子数组,其中包含相关子对象的 id。我将使用 redux-thunk 进行异步操作来调用父级的删除,成功删除的最终操作调用可能会触发另一个异步操作来删除具有与已删除的父级相关的 ref id 的任何子级。跨度>
标签: javascript redux redux-thunk