react-redux存储不在onClick函数内更新

时间:2016-10-16 09:59:02

标签: javascript reactjs redux

我遇到了这个奇怪的问题,我的react-redux存储正在更新,但是在调用操作的函数中没有更新。

this.props.activeundefined,然后我将其设置为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
    });

1 个答案:

答案 0 :(得分:2)

您的Redux状态会与您的操作发送同步更新。您的减速器已在dispatch调用返回时执行。

然而,React不是Redux。 Redux告诉React-Redux的包装器组件状态已经改变。这也发生在dispatch返回之前。

React-Redux然后通过调用forceUpdate告诉React该组件需要重新呈现。 React然后等待,直到感觉它是照顾它的好时机。我没看过,但它可能使用setImmediate或同等的,但它是异步的。这允许React批量更新,也许还有其他原因。

在任何情况下,当时机到来时,React-Redux包装器组件将由React呈现,并且它会使用mapStateToPropsprops提取出状态,然后通过他们将React作为您实际组件的道具。然后,当React认为这是一个好的时候,它会调用你的render方法或函数。在此之前,它可能会执行各种操作,例如调用componentWillReceiveProps或渲染其他需要渲染的组件。无论如何,这不关我们的事。 React做了它的事。但是当你的Render函数被调用时,你的道具现在将反映新的状态。

你不应该依赖onClick处理程序中的新状态。 onClick应该只调用绑定的动作创建者,我猜这个创建者现在更恰当地称为动作调度程序。如果需要对新状态进行某些操作,则应使用Redux-Thunk中间件并创建一个thunked action creator。这些可以访问getState,如果他们不执行任何内部异步内容,那么整个操作实际上可以像简单的调度一样同步(并不是说您需要简单的调度) onClick处理程序)。

最后,React本质上是异步的。把它想象成React你想要什么(组件+道具)并让React从那里拿走它。如果React需要知道如何将组件转换为DOM元素,它就会调用组件的render函数。 React如何或何时做的事情是一个与我们无关的实现细节。