Redux 调度操作时将调用所有还原程序?

Redux 调度操作时将调用所有还原程序?,redux,Redux,我使用combinereducer来组合所有的reducer来创建存储,这是否意味着从任何视图发送的任何操作都会触发所有被调用的reducer来检查操作类型?这是否有点低效率 或者我不完全理解redux设计原则?是的,这是正确的 但是,您必须优化此行为的一个选项(从Redux文档中建议)是使用“重新选择” 重新选择基本上允许您创建记忆选择器,您可以说道具A取决于状态B和状态C,因此只有在状态B或状态C发生变化时才重新计算道具A 请注意,这仍然会触发所有减速器运行(并通过switch语句查看该操作

我使用combinereducer来组合所有的reducer来创建存储,这是否意味着从任何视图发送的任何操作都会触发所有被调用的reducer来检查操作类型?这是否有点低效率

或者我不完全理解redux设计原则?

是的,这是正确的

但是,您必须优化此行为的一个选项(从Redux文档中建议)是使用“重新选择”

重新选择基本上允许您创建记忆选择器,您可以说道具A取决于状态B和状态C,因此只有在状态B或状态C发生变化时才重新计算道具A


请注意,这仍然会触发所有减速器运行(并通过switch语句查看该操作是否适用于它们)——我相信这种行为是无法避免的。但是,使用“重新选择”意味着您的顶级组件仅在存在影响该状态的实际更改时才会收到道具/状态更改,而不是每次触发更改并使React重新渲染所有内容,即使更改没有效果,因为它与某个位置无关。(重新选择中的自述文件解释得更好)

是-当您分派操作时,将调用所有还原程序。你会得到一个很好的副作用。因为如果找不到操作,每个reducer都会返回默认状态,因此您可以使用单个操作设置初始状态

虽然我还没有尝试过,但让单个操作影响多个还原程序(即更改存储区两个不同部分的状态)可能是有益的

当你像@luanped建议的那样添加“重新选择”时,你会得到很多糟糕的结果

我当前的堆栈是:

  • 针对状态、操作和管理的Redux
  • 重新选择数据转换层
  • 回应意见

将重新选择添加到工作流程并使其与减速器一起工作是上周发生在我身上的最好的事情。

您可以使用

还可以在官方网站上了解性能

事实上,我正在将vue.js与redux一起使用,同样感谢您的建议。欢迎:)但不管怎样,尽管调用了所有的减缩器,但真正发生的是检查了switch语句,只有处理该操作的减缩器会做一些工作,其他减缩器什么也不做,所以这实际上不是一个性能问题。值得一提的是,现代JS将大开关语句优化为具有O(1)访问时间的跳转表,因此您不必担心在减缩器中计算大开关语句,即使很多时候动作与任何条件都不匹配。减速器内的动作观察者模式最好不要通过开关进行操作,这是观察者模式的完美例子
许多病态结果
听起来与发生在我身上的
最好的事情相反
,那么你是不是建议使用
重新选择
?呵呵,病态是邪恶还是扭曲===好,但出乎意料。。。。是的,重新选择是对工作流程的一个非常强大的补充。当你意识到你的选择器可以根据你的状态返回momoized函数时,你就在家:)@Kocur4d你是什么意思
如果没有找到动作,每个减速机都会返回默认状态你只需一个动作就可以获得初始状态设置
?@Reza你所有的减速机在开关中都有
默认:返回状态
陈述当您分派动作时,
dispatch({type:'i__动作',…})
所有还原程序都将看到此动作,而不仅仅是在case语句中定义此动作的还原程序。因此,如果您明智地使用初始状态,您只需执行一个操作即可获得应用程序所需的初始形状。@Kocur4d如果我错了请纠正我
default:return state
,这并不意味着它总是返回初始状态,如果您更改了状态,那么从下次开始,您将获得更改后的状态作为默认状态。所以它总是返回任何减速器的当前状态。
import { combineReducers } from 'redux';
// redux-ignore higher-order reducer
import { ignoreActions } from 'redux-ignore'
 combineReducers({
  counter: ignoreActions(counter, [INCREMENT_COUNTER])
});