javascript - react 终极版 : Confused about where to define certain actions

标签 javascript reactjs redux react-redux redux-thunk

在 React Redux 项目中:组件 Item 充当组件 ProductCategory 的容器。 Item 应始终监听点击事件,但根据其包含的内容以不同方式处理事件:如果它包含 Product,则应调度 ADD_TO_CARTOPEN(如果它包含 Category)。

我已经有产品和类别的 Action 创建者,它们目前使用 redux-thunkaxios 处理异步 API 请求。 OPENADD_TO_CART 应该是这些 Action 创建者的一部分,还是该功能属于看板的 Action 创建者?哪个 reducer 应该处理这些 Action ?

最佳答案

这个问题超出了您当前提供的范围,因为您没有提到您的 reducer 的架构,但无论如何,让我们分部分来:

Should the OPEN and ADD_TO_CART be a part of these action creators or does this functionality belong in the board's action creator?

虽然我不完全理解您所说的 board 的 Action 创建者是什么意思,但我相信如果 Action 与单个创建者结合在一起,推理起来要简单得多,例如:

function addToCart(item) {
  return dispatch => dispatch({type: ADD_TO_CART, item})
}

与让不同的创作者分派(dispatch)相同的 Action 相比,您的代码变得更难调试,因为您可能不完全确定哪个创作者分派(dispatch)了哪个 Action ,所以我的建议是:1 个创作者 -> 1 个 Action 。

同时,在将 Action 创建器与您的组件连接时,请尽可能清楚地保持 Action ,这样您就不必在运行时调试代码以查看实际发生的情况,例如:

if(this.props.isItem) {
  this.props.addToCart(this.props.item);
} else {
  this.props.open(this.props.category);
}

代码是不言自明的,可以防止运行时出现奇怪的行为。

And which reducer should handle these actions?

这是一个更棘手的问题,不仅仅是因为我不知道你的 reducer 的当前结构,而且通常选择正确的架构总是很困难,但作为一般准则我会说:

Always split your reducers to sub-domains of your problem

我看到您有一个名为 OPEN 的操作,这让我认为您实际上是在将 reducer 用作 View 模型,但这也取决于实现细节。

在我看来,View Model reducer 非常有用,但应该小心,如果你有 OPEN 操作,这意味着你不仅要存储项目信息,还要存储应用程序 View 的状态在这个 reducer 中,我会将它重命名为 ITEM_OPEN,这样你也可以对其他子域执行 OPEN 操作,同样,如果你正在创建一个 OPEN 操作,您应该存储哪个项目是 open 并且您的 reducer 实际上会在您的应用程序中产生一个新状态。

如果你不想要这个(将应用程序状态存储在 reducer 中作为 View 模型),我会删除 OPEN 操作,只需通过 react-router 或类似操作来处理它。

因此,根据您提供的有限信息判断,我会说您应该有 2 个 reducer ,一个用于元素,一个用于购物车,ADD_TO_CART 操作显然应该由购物车 reducer 处理, OPEN 应该由 item reducer 处理。

关于javascript - react 终极版 : Confused about where to define certain actions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41911529/

相关文章:

javascript - 使用 ReactJS 处理 AJAX 调用后的 Rails flash 消息

redux - 使用 normalizr 规范化简单数组

javascript - 如何让 Next.js 和 redux-api 工作(使用 next-redux-wrapper)

javascript - Angular 认证

javascript - 内联函数通过 id 调用自动元素

javascript - W3C 标准中的 document.FORMNAME 是什么?

javascript - 重构 JS 对象数组

javascript - 仅提取特定单词后的 <string>/<string> 或 <string>

javascript - 如何在 React 中正确编写表格映射列表?

reactjs - 刷新时状态值在react.js中丢失