React-Redux:是否应该将所有组件状态都保存在 Redux Store 中

IT技术 javascript reactjs redux
2021-04-02 10:46:10

假设我有一个简单的切换:

当我单击按钮时,颜色组件在红色和蓝色之间变化

我可能会通过做这样的事情来达到这个结果。

索引.js

Button: onClick={()=>{dispatch(changeColor())}}
Color: this.props.color ? blue : red

容器.js

connect(mapStateToProps)(indexPage)

action_creator.js

function changeColor(){
 return {type: 'CHANGE_COLOR'}
}

减速器.js

switch(){
case 'CHANGE_COLOR':
return {color: true}

但这是一大堆代码,我可以在 5 秒内用 jQuery、一些类和一些 css 来实现......

所以我想我真正要问的是,我在这里做错了什么?

5个回答

Redux 主要用于“应用程序状态”。也就是说,任何与您的应用程序逻辑相关的东西。建立在它之上的视图是该状态的反映,但不必专门使用该状态容器来完成它所做的一切。

只需问以下问题:此状态对应用程序的其余部分重要吗?应用程序的其他部分是否会根据该状态表现不同?在许多小情况下,情况并非如此。拿一个下拉菜单:它打开或关闭的事实可能不会对应用程序的其他部分产生影响。因此,将其连接到您的商店可能有点矫枉过正。这当然是一个有效的选择,但并没有真正为您带来任何好处。你最好使用this.state它并结束它。

在您的特定示例中,切换按钮的颜色是否对应用程序的其他部分产生任何影响?如果它是应用程序主要部分的某种全局开/关切换,那么它绝对属于商店。但是,如果您只是在单击按钮时切换按钮颜色,则可以保留本地定义的颜色状态。单击按钮的动作可能有其他需要动作分派的效果,但这与它应该是什么颜色的简单问题是分开的。

一般来说,尽量让你的应用程序状态尽可能小。你不必把所有东西都塞进去。在必要时这样做,或者在那里保留一些东西很有意义。或者,如果使用开发工具让您的生活更轻松。但不要过分强调它的重要性。

嘿,我知道这个问题永远不会有明确的答案,但我认为你的逻辑在这里非常合理
2021-06-04 10:46:10
IMO,这不是完美的答案。这取决于。将 ui 状态存储到反应状态将使 redux 存储干净,但最终会成为难以测试的非功能组件。将 ui 状态存储到反应状态会增加开发人员的大量工作,因为我们必须编写额外的减速器。但是,有许多包可以帮助您更轻松地将 ui 状态存储在 redux 中,请查看redux.js.org/docs/faq/OrganizingState.html以获取更多详细信息。
2021-06-05 10:46:10

Redux FAQ:Organizing State
这部分 redux 官方文档很好地回答了你的问题。

使用本地组件状态很好作为开发人员,您的工作是确定构成您的应用程序的状态类型,以及每个状态应位于何处。找到一个适合你的平衡点,然后坚持下去。

确定应该将哪种数据放入 Redux 的一些常见经验法则:

  • 应用程序的其他部分是否关心这些数据?
  • 您是否需要能够基于这些原始数据创建进一步的派生数据?
  • 是否使用相同的数据来驱动多个组件?
  • 能够将这种状态恢复到给定的时间点(即时间旅行调试)对您来说是否有value?
  • 您是否要缓存数据(即,如果它已经存在,则使用它的状态而不是重新请求它)?

为了突出@AR7 提供的重要链接,并且因为该链接移动了一段时间:

将 React 用于对全局应用程序无关紧要且不会以复杂方式变异的临时状态。例如,某个 UI 元素中的切换、表单输入状态。将 Redux 用于全局重要或以复杂方式变异的状态。例如,缓存的用户或帖子草稿。

有时你会想要从 Redux 状态移动到 React 状态(当在 Redux 中存储一些东西变得尴尬时)或相反(当更多组件需要访问一些曾经是本地的状态时)。

经验法则是:做任何不那么尴尬的事情。

丹·阿布拉莫夫:https : //github.com/reactjs/redux/issues/1287#issuecomment-175351978

这就是 Redux 的问题,开发人员过度设计状态设计,这总是将可能相当简单的应用程序变成复杂的结构。

Redux 对我来说是一种react架构,应该在实施之前进行良好的计划和设计。

https://kentcdodds.com/blog/application-state-management-with-react/ “redux 如此成功的原因之一是 react-redux 解决了 Prop-Drilling 问题。通过简单地将组件传递给一些神奇的连接函数,您可以在树的不同部分共享数据,这一事实非常棒。它对减速器/动作创建者/等的使用。也很棒,但我相信 redux 无处不在是因为它解决了开发人员的 Prop-Drilling 痛点。

这就是我只在一个项目中使用过 redux 的原因:我一直看到开发人员将他们所有的状态都放到了 redux 中。不仅是全局应用程序状态,还有本地状态。这会导致很多问题,其中最重要的是,当您维护任何状态交互时,它涉及与减速器、动作创建者/类型和调度调用的交互,最终导致必须打开许多文件并进行跟踪通过头脑中的代码找出正在发生的事情以及它对代码库的其余部分有什么影响。“”

是的,努力将所有组件状态存储在 Redux 中是值得的如果这样做,您将受益于 Redux 的许多功能,例如时间旅行调试和可重播的错误报告。如果不这样做,这些功能可能完全无法使用

任何时候您不在Redux 中存储组件状态更改,该更改都会从 Redux 更改堆栈中完全丢失,并且您的应用程序 UI 将与存储不同步。如果这对你来说并不重要,那么问问自己为什么要使用 Redux?没有它,您的应用程序将不那么复杂!

出于性能原因,您可能希望回退到this.setState()任何会重复调度许多操作的东西。例如:每次用户键入一个键时,将输入字段的状态存储在 Redux 中可能会导致性能不佳。您可以通过将其视为事务来解决此问题:一旦“提交”用户操作,将最终状态保存在 Redux 中。

您的原始帖子提到了 Redux 方式是如何“编写大量代码的地狱”。是的,但您可以对常见模式(例如本地组件状态)使用抽象。

作为更具体的答复,记录代码库中的每个变量并不是一个有用的比喻,因为问题是关于是否使用this.setState()dispatch(action...). 不需要在this.setState()任何地方都使用,但是当你需要时,我的建议是在 99% 的情况下使用 Redux,this.setState()基于性能问题回退到1%。
2021-05-22 10:46:10
那为什么要使用 Redux 呢?如果你不把所有东西都放在 Redux 中,你就会失去所有的特性,比如 devtools。这真的是全有或全无。如果您将 setState() 用于下拉菜单,就像这篇文章的顶部答案一样,您不能使用 devtools 来调试您的用户可能在下拉菜单中遇到的任何问题。对叠加层使用 setState() 时情况更糟,因为无法在叠加层显示前后进行时间旅行。在这里和那里撒上 setState() 很容易出错,因为开发人员必须不断考虑可能会破坏的内容。
2021-05-24 10:46:10
改进调试是一个有用的目标,也是 redux 的一个很好的特性,但我认为信噪比也很重要。可以将代码库中的每个变量都记录下来,但这会增加大量额外的代码,使实际代码更难阅读,而且日志记录也很难找到。我认为这同样适用于使用 redux。在 redux 中拥有所有状态可以改进调试,但是额外的代码和抽象会产生成本,这会使代码更难阅读,甚至使一些调试任务更难。(并且当 redux 开发工具崩溃时,许多调试收益都会丢失。)
2021-05-26 10:46:10
实际上,您可能无法调试 API 逻辑。这就是我的观点。很难预见你会打破时间旅行的场景,所以最好将所有状态(包括选择框状态)放在 Redux 中,直到出现性能问题。
2021-05-27 10:46:10
在我看来,记录每个变量类似于将所有内容都放在 Redux 中,并且作为一般规则同样不可取。留下一些东西出来终极版并不否定了这一切的特征在终极版,只要状态被分离。即,即使选择框的状态不是,我仍然可以调试通过 Redux 传输的 API 调用逻辑。OP 有一个观点 - 它需要在多个地方使用更多代码才能使用 Redux,这在他们列出的特定示例中可能是不合理的。
2021-05-31 10:46:10