javascript - Dispatch 和 setState 不能一起工作,而是独立工作

标签 javascript reactjs redux

我有一个 DatePicker 组件,当我单击新日期时,它应该在 redux 存储中设置更改日期,并且在用户体验方面也很明显。

出于某种原因,我将把我的代码放在下面的 handleChange 函数中,同时使用 setStatethis.props.addFitler 在那里触发,redux 存储正确更新,但 UX 没有。 但是,如果我注释掉 this.props.addFilter 调度函数,用户体验就会正确更新(显然商店不会)。

为什么这两者不能一起工作?我尝试过更改它们的调用顺序,将每个函数提取到另一个函数中,使用 mapDispatchToProps 而不是直接调用操作创建者,但都无济于事。

DatePicker.js:

import DatePicker from 'react-datepicker';

class DatePick extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      date: moment()
    };
    this.handleChange = this.handleChange.bind(this);
  }
  handleChange(date) {
    const { dashboardName } = this.props;
    const { name } = this.props.column;
    this.props.addFilter(date, dashboardName, name);
    this.setState({date});
  }
  render() {
    return (
      <div style={{display: 'inline-block', fontWeight: 'bold'}}>
        <DatePicker
          dateFormat="DD/MM/YYYY"
          selected={this.state.date}
          onChange={this.handleChange} />
      </div>
    );
  }
}

const mapActionToProps = {
  addFilter
};

export default connect(null, mapActionToProps)(DatePick);

handleChange 函数中传递的“date”参数是一个 moment 对象,就像用于设置initialState 的对象一样,因此这不是问题。

其他信息:如果我在 setState() 之前和之后进行控制台日志,它会两次记录初始状态。

有人遇到过这个问题或者有什么想法吗?如果您需要查看我的 redux,我可以使用更多代码更新帖子,但我认为这不是问题,因为它可以很好地更新商店。

最佳答案

我找到了解决方案, Action 创建者调用正在执行一些同步操作,并且整个 UI 线程被锁定,直到它完成正在执行的操作。因此,我们可以借助 setTimeout 稍微延迟调用,一切都会按预期进行

关于javascript - Dispatch 和 setState 不能一起工作,而是独立工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43068297/

相关文章:

javascript - 单击提交后隐藏表单组件 React js

javascript - 如何从文档片段中获取实际元素?

javascript - React Hooks setState 函数未设置状态

reactjs - React-Router:如何在路由转换之前等待异步操作

javascript - 从容器外部访问生命周期方法的变量

javascript - 将 cron 转换为 "simpler"人类可读格式的包?

javascript - TypeScript 枚举到对象数组

javascript - google-map-react 使用多个标记使 map 居中

reactjs - 搜索不适用于使用远程数据的 React Material 表

javascript - react-router 1.0 : using this. props.children 而不是 RouteHandler