首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >存储在onClick函数中不更新

存储在onClick函数中不更新
EN

Stack Overflow用户
提问于 2016-10-16 09:59:01
回答 1查看 2.5K关注 0票数 3

我正在经历这个奇怪的问题,我的react存储正在更新,但在调用操作的函数中没有更新。

this.props.activeundefined,然后我将它设置为带有this.props.actions.activeSet(activeProc)的整数,但它仍然是undefined,并输入下一个if条件。

我知道我的应用程序可以工作,因为其他的东西都与this.props.active一起工作,具有正确的值。

这应该发生吗?

编辑:

在进行了一些测试之后,在onClick函数中状态似乎保持不变。

console.log(this.props)函数中对onClick进行的所有调用都显示状态没有变化,但是在测试结束时添加setTimeout(() => {console.log(this.props)}, 1)显示状态正在更新。

该应用程序的其他部分正在按预期工作,状态更改立即应用。

但我还是不明白怎么回事。

组件函数代码

代码语言:javascript
运行
复制
() => {
    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,
    };
}

动作码

代码语言:javascript
运行
复制
export const activeSet = (procId) => {
    return {
        type: 'ACTIVE_SET',
        procId
    }
}

减速器代码

代码语言:javascript
运行
复制
case 'ACTIVE_SET':
    return Object.assign({}, state, {
        active: action.procId
    });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-17 06:29:57

您的Redux状态与动作的分派同步更新。您的还原器在dispatch调用返回时已经执行。

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

React Redux然后告诉React,组件需要通过调用forceUpdate重新命名。然后反应,直到它觉得这是一个很好的时间来处理这件事。我还没有看过,但它可能使用setImmediate或等效,但它是异步的。这允许对批处理更新做出反应,也许还有其他原因。

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

您不应该依赖于onClick处理程序中的新状态。onClick应该只调用绑定的动作创建者,我猜现在更恰当地称为动作分派器。如果需要对新状态做一些事情,您应该使用Redux中间件并创建一个被拒绝的动作创建者。它们可以访问getState,如果它们不执行任何内部异步操作,那么整个操作实际上可以和简单的调度一样同步(而不是在简单的onClick处理程序中需要这样的操作)。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40069040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档