【问题标题】:Accessing global state from a slice从切片访问全局状态
【发布时间】:2020-12-18 04:55:46
【问题描述】:

我正在为整个应用程序使用@reduxjs/toolkit createSlice 功能。 我经常需要访问其他切片的状态。一个常见的例子是“一对多关系”,其中孩子在各自状态下通过“byParentId”键以标准化形式存储。因此,当用户使某些“父”处于活动状态时,“子”中的几乎每个选择器/减速器/传奇效果都需要访问“父”状态“活动”字段。最初,我只是在组合减速器的同时将“activeParent”字段添加到操作中。后来,在更多这样的情况下,我最终只使用“全局”变量来处理每个动作的整个状态,而不是在 combine reducers 函数中制作数据准备。

这也提高了 redux-saga 中的性能,其中 yield select(selector) 调用替换为同步 selector(global)

Here@gaeron 声称这种方法是一种反模式,通常可以通过以下方式解决:

从 reducer 中删除该逻辑并将其移至选择器

好的,如果可能的话。

将附加信息传递到操作中;

有时它很好,但通常会引入不必要的性能损失。 要将附加信息传递给操作,应通过 useSelector 将其检索到可能不需要它的组件中,请阅读:更多重绘。

让视图代码执行两个动作。

再次,很好,但并非总是如此。它需要将动作序列放在多个组件中,而不是具有简单的逻辑, 当一个动作导致另一个动作时。

提到的一个问题:

reducer 与彼此的状态形状耦合,这使状态结构中的任何重构或更改变得复杂。

可以通过使用选择器而不是直接访问“外部”状态来轻松避免。

这种方法是否有真正的理由成为反模式?

【问题讨论】:

    标签: reactjs redux redux-saga redux-toolkit


    【解决方案1】:

    将整个根状态放入一个动作中绝对是一种反模式,应该避免。

    你可能想有时put additional data from the state into specific actions if the reducer logic needs it。

    除此之外,我还需要查看有关您正在尝试做什么以及代码看起来如何提供更多建议的更多具体细节。

    【讨论】:

    • 感谢您的回复,我找到了这个线程github.com/reduxjs/redux/issues/601 @gaeron 提到这是一种反模式,但很多人实际上不同意。不幸的是,我的问题仍然悬而未决:为什么这种模式声称是“反”的?
    猜你喜欢
    • 2020-05-24
    • 2021-12-15
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2011-07-19
    • 2022-12-31
    相关资源
    最近更新 更多