从Redux reducers中获取结果

3

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

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

我的问题是:如何获取触发分派操作后创建的对象的ID?

分派操作返回完整状态,而不仅仅是新对象。我看到了几个选项,但我不确定哪个最好...

选项1:生成并传递ID

在addNode中自己生成ID,并将其与其他数据一起传递给createNode(...)。

从实际角度来看,这可能是最容易的,但从概念上讲,我认为它非常糟糕。以前的内部ID生成策略突然暴露在我的函数中,并且更重要的是,根据ID策略,我可能不得不处理各种ID冲突和/或同步以避免这些问题。

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

我想可以从结果状态中推断出新节点。但这可能会变得非常复杂,更不用说缓慢了...

选项3:在操作中回传ID

操作应该是不可变的。但是,如果我在我的操作中指定一个“result”属性,那么reducer会将所需信息写入其中以传递出去,实际上会发生什么?在我看来,只要reducer从不将“result”属性视为操作输入负载的一部分,这应该可以正常工作。

这仍然有点危险,因为操作现在部分可变。但考虑到其他选项,这是我目前最喜欢的选项。

编辑:之前曾提出过一个类似的问题,但答案是更改reducer以避免需要结果。可悲的是,这里没有这个选项。


我认为在这里提供一些更详细的信息会更有帮助,这样人们可以建议替代结构,以帮助实现您需要做的事情。这个问题的核心似乎是“#3是否可以?”。鉴于缺乏原因的细节,很难确定它到底有多不好,但这表明您需要派发操作返回值来构建内部应用程序状态,这将违反Redux的核心原则,即存储库是唯一的真相来源。 - numbers1311407
1个回答

1
听起来你的reducer目前是生成新创建对象id的,如果是这样,我猜想这应该是一个相当简单的同步过程,但我不认为这种方式是正确的。我期望reducer只针对通过action传递的数据进行操作,其中应该包括新对象的id。因此,我建议采用第四种选项。将生成id的代码从reducer中分离出来,放到它自己的地方。使用该代码将id包含在分派给创建新对象的action中,可以从任何分派action的代码或者action创建器本身调用该代码。从函数中返回id即可。
const addNode = (data) => {
  const action = createNode(data);
  dispatch(action);
  ...
  return action.payload.id;
}

抱歉回复晚了。在回到这个问题之前,我在项目中进行了更大的绕路。我最初以这种方式发布问题,是因为将id生成器挖掘出来,并使id成为输入的一部分感觉很不好,因为我认为它是数据模型的内部细节。但是,在使用此功能的几个更具体的操作后回来看,这似乎真的是最好的选择,并且总体上使界面非常简洁。 - Carsten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接