我有一个从外部代码调用的函数。其效果应该是根据传递的数据在我的redux存储中创建一个对象,并返回该对象的ID作为将来更新的句柄:
const addNode = (data) => {
dispatch(createNode(data));
...
return createdNodeId;
}
我的问题是:如何获取由于调度动作而创建的对象的ID?
分派返回完整状态,而不仅仅是新对象。我看到了两种选择,但是我不确定哪一种是最好的...
我自己在addNode中生成id,并将其与其余数据一起传递到createNode(...)。
从实践的角度来看,这可能是最简单的,但是从概念的角度来看,我觉得这很可怕。以前内部的id生成策略突然暴露在我的函数中,而且,根据id策略,我可能不得不处理各种id冲突和/或同步以避免这些冲突。
我想可以从结果状态推断新节点。但这很快就会变得非常复杂,不要介意慢...
动作应该是不变的。但是,如果我在操作中指定一个“结果”属性(减速器将写入该属性以传递所需的信息),那会发生什么呢?以我的理解,只要reducer从未将“结果”属性视为动作的输入有效负载的一部分,这应该可以正常工作。
这仍然有点狡猾,因为现在该动作是部分可变的。但是考虑到其他选择,这是我现在最喜欢的。
编辑:之前有人问过一个similar question,但答案是要更改减速器以避免需要结果。可悲的是,这不是这里的选择。
答案 0 :(得分:1)
听起来好像是您的reducer正在为新创建的对象生成id。如果这是正确的,那么我猜它是一个相当简单的同步过程。在我看来,这也不对。我希望减速器仅对操作中传递的数据进行操作,该操作应包括新对象的ID。所以我建议选择4 ..
将从化简器生成id的代码分解到自己的空间中。使用该代码可以将ID包含在为创建新对象而分派的动作中,该动作可以是从分派动作的任何代码,也可以是动作创建者本身来的。从函数中返回ID。
const addNode = (data) => {
const action = createNode(data);
dispatch(action);
...
return action.payload.id;
}