哎呀,我对此感到愚蠢,但我已经阅读了http://redux.js.org/的每一部分(完成了egghead教程,并阅读了4次常见问题解答:http://redux.js.org/docs/faq/ImmutableData.html
我所做的是将我的一个减速器存在,总是返回状态,这是唯一被调用的减速器(用断点检查)。即便如此,每次reducer返回状态时都会调用我的subscribe事件。我不明白什么? (Action.SetServerStats以1Hz的速率被调用,订阅也以1Hz的速率被调用
BTW Chrome Redux扩展程序表示状态相同,并且带有跟踪反应更新的Chrome的React扩展程序未显示任何更新。
当有人告诉我时,我会很高兴删除这个问题。但是现在,我看到每个减速器都以1Hz的频率调用,并且所有这些减速器都返回了他们得到的商店的切片(状态) )。
所以我不理解订阅,并且它每次都返回,即使商店树没有被修改(并且反应 - 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 })
答案 0 :(得分:2)
正确。即使状态未以任何方式更新,Redux也会在每次时调度操作时执行所有订阅回调。然后由订阅回调来执行有意义的操作,例如调用getState()
并检查状态的某些特定部分是否已更改。
React-Redux就是一个例子。连接组件类的每个实例都是商店的单独订户。每次调度操作时,connect
生成的所有包装器组件都将首先检查根状态值是否已更改,如果是,则运行它们的mapStateToProps
函数以查看是否mapState
的输出完全改变了。 如果 mapState
输出发生变化,则包装器组件将重新呈现“真实”组件。
您可能需要阅读我的博文Practical Redux, Part 6: Connected Lists, Forms, and Performance,其中讨论了与Redux性能相关的几个重要方面。我的新帖子Idiomatic Redux: The Tao of Redux, Part 1 - Implementation and Intent也详细介绍了Redux的几个部分是如何工作的。