从redux减速器中获取结果

时间:2018-12-05 19:07:48

标签: javascript redux

我有一个从外部代码调用的函数。其效果应该是根据传递的数据在我的redux存储中创建一个对象,并返回该对象的ID作为将来更新的句柄:

const addNode = (data) => {
    dispatch(createNode(data));
    ...
    return createdNodeId;
}

我的问题是:如何获取由于调度动作而创建的对象的ID?

分派返回完整状态,而不仅仅是新对象。我看到了两种选择,但是我不确定哪一种是最好的...

选项1:生成并传递ID

我自己在addNode中生成id,并将其与其余数据一起传递到createNode(...)。

从实践的角度来看,这可能是最简单的,但是从概念的角度来看,我觉得这很可怕。以前内部的id生成策略突然暴露在我的函数中,而且,根据id策略,我可能不得不处理各种id冲突和/或同步以避免这些冲突。

选项2:从结果状态中提取ID

我想可以从结果状态推断新节点。但这很快就会变得非常复杂,不要介意慢...

选项3:将ID传递回行动中

动作应该是不变的。但是,如果我在操作中指定一个“结果”属性(减速器将写入该属性以传递所需的信息),那会发生什么呢?以我的理解,只要reducer从未将“结果”属性视为动作的输入有效负载的一部分,这应该可以正常工作。

这仍然有点狡猾,因为现在该动作是部分可变的。但是考虑到其他选择,这是我现在最喜欢的。

编辑:之前有人问过一个similar question,但答案是要更改减速器以避免需要结果。可悲的是,这不是这里的选择。

1 个答案:

答案 0 :(得分:1)

听起来好像是您的reducer正在为新创建的对象生成id。如果这是正确的,那么我猜它是一个相当简单的同步过程。在我看来,这也不对。我希望减速器仅对操作中传递的数据进行操作,该操作应包括新对象的ID。所以我建议选择4 ..

将从化简器生成id的代码分解到自己的空间中。使用该代码可以将ID包含在为创建新对象而分派的动作中,该动作可以是从分派动作的任何代码,也可以是动作创建者本身来的。从函数中返回ID。

const addNode = (data) => {
  const action = createNode(data);
  dispatch(action);
  ...
  return action.payload.id;
}