【问题标题】:this.state not the same as state in this objectthis.state 与此对象中的状态不同
【发布时间】:2015-12-12 05:20:50
【问题描述】:

我遇到了一个问题,我通过在componentDidMount 中执行 AJAX 调用来加载初始数据,并在回调中为所述 AJAX 调用设置状态。我还希望在之后立即处理我的数据,所以我在setState 回调中调用了另一个函数。以下是我的代码的 sn-p:

filterData(area) {
  console.log(this);
  console.log(this.state);
  console.log(this.state.data);

  ... // The implementation of my filter
}

componentDidMount() {
  let xhr = new XMLHttpRequest();

  xhr.onloadend = () => {
    console.log('* AJAX POST Response Received *');
    if (xhr.status >= 200 && xhr.status < 400) {
      this.setState({ data: JSON.parse(xhr.response) },
        this.filterData(this.area)
      );
    } else {
      console.error('[ERROR] Server returned invalid response');
    }
  };
}

当我查看 this 对象中的状态时,我可以找到我期望的正确状态数据,但 this.statethis.state.data 是在我的构造函数中设置的初始值。任何意见将不胜感激。

编辑

所以我想我在我的代码 sn-p 中遗漏了一些东西。我的过滤函数实际上调用this.setState 将过滤后的数据存储在状态中。我认为这实际上是导致我的问题的原因。

修改后的sn-p:

filterData(area) {
  console.log(this);
  console.log(this.state);
  console.log(this.state.data);

  ... // The implementation of my filter
  this.setState({ filtered_data: filtered });
}

我目前的解决方案:

filterData(area, all_data) {
  if(this.state.data || all_data) {
    ... // The implementation of my filter
  }
  this.setState({ filtered_data: filtered });
}

componentDidMount() {
  let xhr = new XMLHttpRequest();

  xhr.onloadend = () => {
    console.log('* AJAX POST Response Received *');
    if (xhr.status >= 200 && xhr.status < 400) {
      this.filterData(this.area, JSON.parse(xhr.response));
    } else {
      console.error('[ERROR] Server returned invalid response');
    }
  };
}

【问题讨论】:

    标签: javascript reactjs ecmascript-6


    【解决方案1】:

    setState 的第二个参数必须是函数。试试这个:

    this.setState({
        data: JSON.parse(xhr.response)
    }, () => this.filterData(this.area));
    

    【讨论】:

    • 感谢您的建议,但问题仍然存在
    • 实际上,当我修改代码以尝试此解决方案时,似乎 filterData 甚至没有运行,因为日志也不再显示
    • 对不起,我的原始答案使用了传统的 function,我已将其更改为箭头函数以确保 this 绑定。确保你正在这样做。
    • 是的,我在测试时这样做了,但仍然没有运气
    • 这是正确的答案,如果你想摆脱匿名功能,你也可以使用.bindjsbin.com/kifekamano
    【解决方案2】:

    setState 导致主管重新渲染,就反应而言,使您在它之后所做的任何事情都无关紧要。您需要稍后挂钩到组件生命周期,例如 componentWillUpdate 或 componentDidUpdate 来运行您的过滤器功能。

    【讨论】:

    猜你喜欢
    • 2018-12-09
    • 2019-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2018-08-24
    • 2020-08-26
    相关资源
    最近更新 更多