我遇到了这个奇怪的问题,我的react-redux存储正在更新,但是在调用操作的函数中没有更新。
this.props.active
为undefined
,然后我将其设置为this.props.actions.activeSet(activeProc)
的整数,但它仍为undefined
并进入下一个if条件。
我知道我的应用正在运行,因为其他所有内容都适用于具有正确值的this.props.active
。
这应该发生吗?
修改
在进行一些测试后,似乎状态在onClick函数中保持不变。
在onClick函数中对console.log(this.props)
的所有调用都显示状态没有变化,但在测试结束时添加setTimeout(() => {console.log(this.props)}, 1)
表示状态正在更新。
应用程序的其他部分按预期工作,并立即应用状态更改。
但我仍然不明白发生了什么。
组件功能代码
() => {
console.log(this.props.active); // undefined
if (this.props.active === undefined && this.props.readyQueue.length > 0) {
let activeProc = this.props.readyQueue[0];
this.props.actions.readyPop();
this.props.actions.activeSet(activeProc); // set to an integer
this.props.actions.execStateSet("Running");
}
console.log(this.props.active); // still remains undefined
if (this.props.active === undefined) {
this.props.actions.execStateSet("Idle");
}
}
function mapStateToProps(state, props) {
return {
active: state.ProcessReducer.active,
};
}
操作代码
export const activeSet = (procId) => {
return {
type: 'ACTIVE_SET',
procId
}
}
减速机代码
case 'ACTIVE_SET':
return Object.assign({}, state, {
active: action.procId
});
答案 0 :(得分:2)
您的Redux状态会与您的操作发送同步更新。您的减速器已在dispatch
调用返回时执行。
然而,React不是Redux。 Redux告诉React-Redux的包装器组件状态已经改变。这也发生在dispatch
返回之前。
React-Redux然后通过调用forceUpdate
告诉React该组件需要重新呈现。 React然后等待,直到感觉它是照顾它的好时机。我没看过,但它可能使用setImmediate
或同等的,但它是异步的。这允许React批量更新,也许还有其他原因。
在任何情况下,当时机到来时,React-Redux包装器组件将由React呈现,并且它会使用mapStateToProps
将props
提取出状态,然后通过他们将React作为您实际组件的道具。然后,当React认为这是一个好的时候,它会调用你的render
方法或函数。在此之前,它可能会执行各种操作,例如调用componentWillReceiveProps
或渲染其他需要渲染的组件。无论如何,这不关我们的事。 React做了它的事。但是当你的Render函数被调用时,你的道具现在将反映新的状态。
你不应该依赖onClick
处理程序中的新状态。 onClick
应该只调用绑定的动作创建者,我猜这个创建者现在更恰当地称为动作调度程序。如果需要对新状态进行某些操作,则应使用Redux-Thunk中间件并创建一个thunked action creator。这些可以访问getState
,如果他们不执行任何内部异步内容,那么整个操作实际上可以像简单的调度一样同步(并不是说您需要简单的调度) onClick
处理程序)。
最后,React本质上是异步的。把它想象成React你想要什么(组件+道具)并让React从那里拿走它。如果React需要知道如何将组件转换为DOM元素,它就会调用组件的render
函数。 React如何或何时做的事情是一个与我们无关的实现细节。