Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为整个状态调用Redux订阅_Javascript_Redux_Reducers - Fatal编程技术网

Javascript 为整个状态调用Redux订阅

Javascript 为整个状态调用Redux订阅,javascript,redux,reducers,Javascript,Redux,Reducers,我有两个减速器,redA和redB。我还有两个控制器ctrlA和ctrlB 目前,当redA或redB中发生状态更改时,因为ctrlA和ctrlB都调用了store.subscribe,所以无论是什么原因导致状态发生更改,它们都会收到通知 有没有一种方法可以只通知控制器是根据哪个reducer进行的更改,或者更好的是,根据每个操作通知控制器 或者这是我思考REDUX的方式中的一个bug?我很高兴听到你的意见。非常感谢这就是Redux的工作原理。Redux对于其状态的不同部分没有不同的更改事件。事

我有两个减速器,redA和redB。我还有两个控制器ctrlA和ctrlB

目前,当redA或redB中发生状态更改时,因为ctrlA和ctrlB都调用了store.subscribe,所以无论是什么原因导致状态发生更改,它们都会收到通知

有没有一种方法可以只通知控制器是根据哪个reducer进行的更改,或者更好的是,根据每个操作通知控制器


或者这是我思考REDUX的方式中的一个bug?我很高兴听到你的意见。非常感谢

这就是Redux的工作原理。Redux对于其状态的不同部分没有不同的更改事件。事实上,每次操作到达root reducer函数时,都会运行订阅回调,即使调度的操作不会导致任何更改

Redux只是通知订阅者一个操作已被调度,现在由订阅者根据当前状态决定他们想要做什么。通常这涉及区分当前状态和旧状态,React-Redux的connect函数会自动生成包装器组件

因此,是的,如果您有两个订阅到存储的不同组件,则每当调度操作时,都会通知每个组件,即使state.a已更新且组件仅对state.b感兴趣

另外,手动订阅商店也是个坏主意。我写了一篇长篇评论

编辑

以下是订户如何区分状态的示例:

let prevState;

store.subscribe(() => {
    const currState = store.getState();
    const stateHasChanged = !_.isEqual(currState, prevState);

    prevState = currState;
});

这不是你在生产中应该怎么做,但它展示了一个基本思想:参考旧状态,获取当前状态,对两者进行某种比较。

你的问题太广泛了。。。可能是一个显示真实代码、预期值与实际行为的代码段。您只需检查订阅的方法,就可以检查所需的实际值是否正在更改。另一方面,至少在redux世界中,控制器不应该知道这些操作。Redux应该注意动作类型以及如何处理它们谢谢,目前我只使用vanilla js来尝试在做出反应之前对Redux有一个很好的了解。这里的主要问题是,订户如何知道是什么导致了状态变化?据我所知,导致状态更改的操作没有在subscribe中返回,如果只存储一个带有上次调用的操作的变量,那感觉有点不对劲。在vanilla JS上你会怎么做呢?另外,fwiw:通常我们建议用另一种方式来做——先学习React,然后再学习Redux。这就是说,你应该自由地按照你想要的顺序处理它们。