反应 - 立即将 DataSet1 和 DataSet2 存储到 Redux Store,其中 DataSet2 派生自 DataSet1
react - instantly storing DataSet1 and DataSet2 to Redux Store where DataSet2 is derived from DataSet1
(很抱歉,如果有人问类似的问题,但我在多个动作调度中找到了一些,并重新使用了 redux-batched-subscribe。这不是我想要的)
我需要制作一个与下图类似的仪表板。
它使用三个来源 - DataSet1(用户添加的数量)、DataSet2 和 DataSet3。
DataSet2 和 DataSet3 使用 utils/function.
从 DataSet1 派生(即某些计算是在 DataSet1 上完成的)
任何时候 DataSet1 发生变化(用户添加新数量、编辑或删除它)DataSet2 和 DataSet3 都应该重新计算并且仪表板应该立即完全更新。
我正在尝试设计它以避免重复重新计算和循环重新渲染。
我正在考虑使用 Redux-Thunk。
执行类似任务的 React 方法是什么?
谢谢!
编辑:
删除了不需要的细节,将重新选择添加到标签
欢迎使用 React 和 Redux - 当你掌握它时,它很棒。
我假设您正在使用 react-redux
包来处理 React 和 Redux 之间的绑定。这个包提供了一个名为 Provider
的 class ,你可以将你的应用程序包装在其中。Provider 做了几件事,但其中一件重要的事情是它订阅商店并在商店更改时触发重新渲染.
如@zzzzBov 所述,派生值不应添加到存储中。为此,我们使用 selectors。在您的情况下,这意味着 DataSet1 存在于商店中,而 DataSet2 和
DataSet3 将由 selector 计算。为了清楚起见,下面是用户更改 DataSet1 时的事件流:
- 用户更改了 DataSet1,您在
mapDispatchToProps()
中定义的函数在存储上调度了一个操作。
- 减速器运行,生成一个新的状态对象。
- 存储的任何订阅者都会被调用并传递新的状态对象(在本例中为 Provider)。
- Provider 触发组件的高效重新渲染(我所说的高效是指它检查 select 在
mapStateToProps()
中的状态片段是否已更改)。
- 您的组件负责从存储中呈现 DataSet2 和 DataSet3 select DataSet1,并动态派生 DataSet2 和 DataSet3,然后将它们传递给各自的组件.
如果您不希望 DataSet2 和 DataSet3 组件在商店的每次更改时重新呈现,请使用库 reselect
。 Reselect 缓存派生值,这反过来又避免了虚假的重新渲染。当状态改变时,Reselect 检查它的输入值是否改变了,如果改变了,它重新计算输出。然后您的组件 select 来自 Reselect 而不是 select 直接来自状态对象。
希望对您有所帮助。祝你好运!
(很抱歉,如果有人问类似的问题,但我在多个动作调度中找到了一些,并重新使用了 redux-batched-subscribe。这不是我想要的)
我需要制作一个与下图类似的仪表板。
它使用三个来源 - DataSet1(用户添加的数量)、DataSet2 和 DataSet3。
DataSet2 和 DataSet3 使用 utils/function.
从 DataSet1 派生(即某些计算是在 DataSet1 上完成的)任何时候 DataSet1 发生变化(用户添加新数量、编辑或删除它)DataSet2 和 DataSet3 都应该重新计算并且仪表板应该立即完全更新。
我正在尝试设计它以避免重复重新计算和循环重新渲染。
我正在考虑使用 Redux-Thunk。
执行类似任务的 React 方法是什么?
谢谢!
编辑: 删除了不需要的细节,将重新选择添加到标签
欢迎使用 React 和 Redux - 当你掌握它时,它很棒。
我假设您正在使用 react-redux
包来处理 React 和 Redux 之间的绑定。这个包提供了一个名为 Provider
的 class ,你可以将你的应用程序包装在其中。Provider 做了几件事,但其中一件重要的事情是它订阅商店并在商店更改时触发重新渲染.
如@zzzzBov 所述,派生值不应添加到存储中。为此,我们使用 selectors。在您的情况下,这意味着 DataSet1 存在于商店中,而 DataSet2 和 DataSet3 将由 selector 计算。为了清楚起见,下面是用户更改 DataSet1 时的事件流:
- 用户更改了 DataSet1,您在
mapDispatchToProps()
中定义的函数在存储上调度了一个操作。 - 减速器运行,生成一个新的状态对象。
- 存储的任何订阅者都会被调用并传递新的状态对象(在本例中为 Provider)。
- Provider 触发组件的高效重新渲染(我所说的高效是指它检查 select 在
mapStateToProps()
中的状态片段是否已更改)。 - 您的组件负责从存储中呈现 DataSet2 和 DataSet3 select DataSet1,并动态派生 DataSet2 和 DataSet3,然后将它们传递给各自的组件.
如果您不希望 DataSet2 和 DataSet3 组件在商店的每次更改时重新呈现,请使用库 reselect
。 Reselect 缓存派生值,这反过来又避免了虚假的重新渲染。当状态改变时,Reselect 检查它的输入值是否改变了,如果改变了,它重新计算输出。然后您的组件 select 来自 Reselect 而不是 select 直接来自状态对象。
希望对您有所帮助。祝你好运!