【问题标题】:Getting results back from redux reducers从 redux reducer 中获取结果
【发布时间】:2019-05-07 10:15:09
【问题描述】:

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

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

我的问题是:如何获取作为调度操作的结果创建的对象的 id?

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

选项 1:生成并传递 ID

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

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

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

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

选项 3:将 ID 传递回去

动作应该是不可变的。但是,如果我在我的操作中指定一个“结果”属性,reducer 将写入该属性以传递所需的信息,实际上会发生什么?据我了解,只要“result”属性永远不会被reducer视为操作输入有效负载的一部分,这应该可以正常工作。

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

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

【问题讨论】:

  • 我认为您正在尝试做的更多细节在这里会有所帮助,因为人们可以建议替代结构来帮助完成您需要做的事情。这个问题的核心似乎是“#3 好吗?”。由于缺乏详细的原因,很难说它是如何not-okay,但它表明您需要调度操作返回值来构建内部应用程序状态,这将违反核心原则在 redux 中,store 是唯一的真实来源。

标签: javascript redux


【解决方案1】:

听起来好像是你的 reducer 正在为新创建的对象生成 id。如果那是正确的,那么我猜它是一个相当简单的同步过程。这对我来说似乎也不合适。我希望reducer 作用于动作中传递的数据,其中应该包括新对象的ID。所以我建议选项 4..

将生成 id 的代码从 reducer 分解到它自己的空间中。使用该代码将 id 包含在分派的操作中以创建新对象,可以来自任何分派该操作的代码,也可以来自操作创建者本身。从您的函数中返回 id。

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

【讨论】:

  • 抱歉回复晚了。在回到这个之前,我在我的项目中走了一个更大的弯路。我最初以这种方式发布问题是因为将 id 生成器拉出并使输入的 id 部分感觉很脏,因为我将其视为数据模型的内部细节。但是通过一些使用它的更具体的操作回到它,这看起来确实是最好的选择,并且总体上使界面非常干净。
猜你喜欢
  • 2016-10-06
  • 2021-11-07
  • 2023-03-06
  • 1970-01-01
  • 2021-10-28
  • 2019-08-01
  • 2020-06-18
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多