【问题标题】:Redux will execute all subscription callbacks every time an action is dispatched?Redux 会在每次调度 action 时执行所有订阅回调?
【发布时间】:2017-05-09 17:19:38
【问题描述】:

哎呀,我对此感到很愚蠢,但我已经阅读了以下内容:http://redux.js.org/(完成了蛋头教程,并阅读了 4 次常见问题解答:http://redux.js.org/docs/faq/ImmutableData.html

我所做的是存根我的减速器之一,始终返回状态,这是唯一被调用的减速器(用断点检查)。即便如此,每次减速器返回状态时都会调用我的订阅事件。我不明白什么? (Action.SetServerStats 以 1Hz 速率调用,订阅也以 1Hz 速率调用

顺便说一句,Chrome Redux 扩展表示状态是相同的,而带有 Trace React 更新的 Chrome 的 React 扩展没有显示任何更新。

当有人提示我时,我会很高兴删除这个问题。但现在,我看到每个减速器都以 1Hz 的频率被调用,并且它们都返回了他们得到的存储部分(状态)。

所以我不理解订阅,即使商店树没有被修改,它每次都会返回(并且由 react-redux 进行浅层比较以找出发生了什么变化?)

创建商店并订阅

let store = createStore(reducer, initialState, composeWithDevTools(applyMiddleware(thunk)))
store.subscribe(() => console.log("current store: ", JSON.stringify(store.getState(), null, 4)))

reducers.js

import A from './actionTypes'
import { combineReducers } from 'redux'

export const GLVersion = (state = '', action) => {
    switch (action.type) {
        case A.SetGLVersion:
            return action.payload
        default:
            return state
    }
}

export const ServerConfig = (state = {}, action) => {
    switch (action.type) {
        case A.SetServerConfig: {
            let { ServerPort, UserID, PortNumber, WWWUrl, SourcePath, FMEPath } = action.payload
            let p = { ServerPort, UserID, PortNumber, WWWUrl, SourcePath, FMEPath }
            return p
        }
        default:
            return state
    }
}

export const ServerStats = (state = {}, action) => {
    switch (action.type) {
        case A.SetServerStats:
            return state
        // let { WatsonInstalled, WatsonRunning, FMERunning, JobsDirSize } = action.payload
        // let s = { WatsonInstalled, WatsonRunning, FMERunning, JobsDirSize }
        // return s
        default:
            return state
    }
}

export default combineReducers({ GLVersion, ServerConfig, ServerStats })

【问题讨论】:

    标签: redux


    【解决方案1】:

    正确。 每次,Redux 将在分派操作时执行所有订阅回调,即使状态没有以任何方式更新。然后由订阅回调来做一些有意义的事情,例如调用getState() 并检查状态的某些特定部分是否发生了变化。

    React-Redux 就是一个例子。连接组件类的每个实例都是存储的单独订阅者。每次分派一个动作时,connect 生成的所有包装器组件都会首先检查根状态值是否已更改,如果是,则运行它们提供的 mapStateToProps 函数以查看 @ 的输出是否987654326@ 完全改变了。 如果 mapState 输出发生变化,那么包装器组件将重新渲染您的“真实”组件。

    您可能想阅读我的博文Practical Redux, Part 6: Connected Lists, Forms, and Performance,其中讨论了与 Redux 性能相关的几个重要方面。我的新帖子 Idiomatic Redux: The Tao of Redux, Part 1 - Implementation and Intent 还详细介绍了 Redux 的几个部分的实际工作方式。

    【讨论】:

      猜你喜欢
      • 2013-03-13
      • 1970-01-01
      • 2018-11-09
      • 2015-10-05
      • 1970-01-01
      • 2018-08-18
      • 1970-01-01
      • 2019-07-29
      • 1970-01-01
      相关资源
      最近更新 更多