我正在经历这个奇怪的问题,我的react存储正在更新,但在调用操作的函数中没有更新。
this.props.active是undefined,然后我将它设置为带有this.props.actions.activeSet(activeProc)的整数,但它仍然是undefined,并输入下一个if条件。
我知道我的应用程序可以工作,因为其他的东西都与this.props.active一起工作,具有正确的值。
这应该发生吗?
编辑:
在进行了一些测试之后,在onClick函数中状态似乎保持不变。
在console.log(this.props)函数中对onClick进行的所有调用都显示状态没有变化,但是在测试结束时添加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
    });发布于 2016-10-17 06:29:57
您的Redux状态与动作的分派同步更新。您的还原器在dispatch调用返回时已经执行。
然而,React不是Redux。Redux告诉React Redux的包装组件状态已经改变。在dispatch返回之前也会发生这种情况。
React Redux然后告诉React,组件需要通过调用forceUpdate重新命名。然后反应,直到它觉得这是一个很好的时间来处理这件事。我还没有看过,但它可能使用setImmediate或等效,但它是异步的。这允许对批处理更新做出反应,也许还有其他原因。
在任何情况下,React-Redux包装器组件将在时机成熟时由React呈现,它将使用mapStateToProps将props从状态中提取出来,然后将它们作为实际组件的支持进行反应。然后,当function认为这是一个好时机时,它会调用您的render方法或函数。在此之前,它可能会执行各种操作,例如调用componentWillReceiveProps或呈现其他也需要呈现的组件。无论如何,这不关我们的事。反应做它的事。但是当您的呈现函数被调用时,您的道具现在将反映新的状态。
您不应该依赖于onClick处理程序中的新状态。onClick应该只调用绑定的动作创建者,我猜现在更恰当地称为动作分派器。如果需要对新状态做一些事情,您应该使用Redux中间件并创建一个被拒绝的动作创建者。它们可以访问getState,如果它们不执行任何内部异步操作,那么整个操作实际上可以和简单的调度一样同步(而不是在简单的onClick处理程序中需要这样的操作)。
最后,React本质上是非常异步的。把它想象成告诉你想要什么就做什么(组件+道具),然后让反应从那里拿走。如果function需要知道如何将组件转换为DOM元素,它将调用组件的render函数。如何或何时作出反应是一件与我们无关的实现细节。
https://stackoverflow.com/questions/40069040
复制相似问题