如何在redux中使用有状态组件?

时间:2016-08-08 16:38:29

标签: reactjs redux

我现在正在尝试使用redux,并对它背后的想法感到非常兴奋,但是第一个真正的任务毁了整个事情。

在Redux中,我们应该存储不可变状态并生成一些reducers来转换它。这意味着每个州都可以通过给定的先前状态和一系列行动来复制。

但是如果我需要存储第三方/遗留有状态对象呢?例如,它可能类似于gallery或websocket客户端。 我假设我能够以某种方式使用reducers来启动/停止/管理它,但是状态我不再是无状态的并且不能保证在给定的reducers列表中可重复(websocket客户端可能会生成新的会话ID,甚至是无法维持连接。)

解决这些问题的便捷方法是什么?

3 个答案:

答案 0 :(得分:7)

正如我所看到的,您的问题归结为:您如何将Redux与有状态组件(传统/第三方)混合使用?

你是对的,Redux更适合于controlled组件,即大部分是无状态的组件,并且应该以{{1​​}}接收所有内容。请记住,拥有某些状态并不一定会使组件在Redux中无法使用。示例:对于自动填充组件,“打开”状态(无论下拉列表是否可见)不一定必须由Redux控制。因此,根据组件的实现方式,您肯定很难将其集成到Redux中,或者可能没有。

您有两个选择:您要么重构有问题的组件,以便它们现在受到控制,要么您不将它们的状态保留在Redux上(您不需要)。答案将根据具体情况而有所不同。我知道,对你的案件没有一个全球公认的解决方案。

答案 1 :(得分:2)

Here's a nice explanation from the FAQ docs.简而言之:

  

我是否必须将所有状态都放入Redux?我应该使用React的setState()吗?

     

对此没有“正确”的答案。有些用户更喜欢在Redux中保留每一段数据,以便始终保持其应用程序的完全可序列化和受控版本。其他人更喜欢在组件的内部状态内保持非关键或UI状态,例如“此下拉列表当前是否打开”。

     

使用本地组件状态很好。作为开发人员,您的工作是确定应用程序的状态类型以及每个状态应该存在的位置。找到适合您的天平,并随身携带。

那里有更多信息 - 值得一读。

答案 2 :(得分:0)

记住:redux 没有魔法;它只是一个为您设置道具的包装器/容器。

您甚至可以使用 shouldComponentUpdate 来管理更改有状态组件的 props 应如何触发渲染。

或者利用connect

areStatesEqual
areStatePropsEqual
areOwnPropsEqual
areMergedPropsEqual

为了更好的控制

相关:https://stackoverflow.com/questions/58027300/what-is-the-main-difference-between-using-react-redux-hooks-and-react-redux-conn#:~:text=connect%20can%20be%20used%20with,used%20with%20function%20components%20only.&text=Using%20hooks%20is%20simpler.,disposal%20in%20comparison%20with%20connect%20