在同一组件中两次设置状态

时间:2018-10-05 14:34:46

标签: javascript reactjs

我正在尝试setState进入一个事件类别,以显示在handleCategoryChange内部。类别是从getCategories提取点开始呈现的。我需要向createEventHandler中的操作提取调用发送一个不同的值。 设置状态仅发生一次,而省略第二个以发送状态的第一个值。是否有解决方法?还是这是反应的局限性?

//... styles and imports

class NewEvent extends Component {
  constructor(props) {
    super(props);
    this.state = {
      event: {
        category: ''
      }
    };
    this.createEventHandler = this.createEventHandler.bind(this);
    this.handleCategoryChange = this.handleCategoryChange.bind(this);
  }
  handleCategoryChange(evnt) {
    this.setState({
      event: {
        ...this.state.event,
        category: evnt.target.value
      }
    });
  }
  componentWillMount() {
    this.props.getCategories();
  }
  renderStepOne() {
    const { event } = this.state;
    const { categories } = this.props;
    return (
      <div style={styles.flexColumn}>
        <Typography variant="title">Event</Typography>
        <Select
          value={event.category}
          onChange={this.handleCategoryChange}
          error={categoryError.length > 0}
        >
          {categories.map(category => (
            <MenuItem key={category.id} value={category.name}>
              {category.name}
            </MenuItem>
          ))}
        </Select>
      </div>
    );
  }
  createEventHandler() {
    const { event } = this.state;

    if (!error) {
      let categoryId = this.props.categories.filter(e => {
        if (e.name === event.category) {
          return e;
        }
      });
      categoryId = categoryId[0].id;

      this.setState({
        event: {
          ...event,
          category: categoryId
        }
      });
      this.props.createEvent(event, this.props.history);
    }
  }
  render() {
    const { step } = this.state;
    const { isFetching, user, categories } = this.props;
    return (
      <ViewContainer title="New Event" isFetching={isFetching}>
        <Paper style={styles.paper}>
          <div style={styles.body}>{this.renderStepOne()}</div>
          <MobileStepper
            type="dots"
            steps={0}
            position="static"
            nextButton={
              <Button
                variant="raised"
                color="primary"
                onClick={this.createEventHandler}
                disabled={isFetching}
              >
                Submit
                <KeyboardArrowRight />
              </Button>
            }
          />
        </Paper>
      </ViewContainer>
    );
  }
}
const mapStateToProps = state => ({
  categories: state.events.categories
});
const mapDispatchToProps = dispatch => ({
  createEvent: (event, history) => dispatch(createEvent(event, history)),
  getCategories: () => dispatch(getCategories())
});
export default connect(
  mapStateToProps,
  mapDispatchToProps
)(withRouter(NewEvent));

1 个答案:

答案 0 :(得分:0)

您可以像这样尝试使用功能性setState:

this.setState(() => ({
  event: {
    ...this.state.event,
    category: evnt.target.value
  })
});

这样,涉及状态设置的所有事物都会同时发生。