状态不立即更新ReactJS

时间:2015-08-13 03:45:10

标签: javascript reactjs setstate

我无法弄清楚我在这里做错了什么。我有一个事件触发一个函数来改变几个值的状态,这样我就可以启动一个API调用;但是,第一次运行该功能时状态不会改变。第二次运行该函数时,将设置上一次运行的状态更改。什么可能导致这种延迟?

因此,您可以在下面看到handleFilterChange从事件中接收值,我可以验证是否正确接收了值;但是,如果我在设置后立即检查状态值,我可以看到它是未定义的。当事件第二次出现时;但是,我可以看到原来的状态变化现在已经发生,但第二个没有。那么为什么必须调用setState两次来实际设置状态呢?

var GridView = React.createClass({
  getInitialState: function() {
    window.addEventListener("scroll", this.handleScroll);
    return {
      data: [],
      page: 0,      //for pagination
      loadingFlag: false,
    };
    },

  getMainFeed: function() {

...

 }, //end function
 getFilteredItems: function() {
  ...

}, //end function
  componentWillMount: function() {

  },
  listenForFilterChange: function() {
    window.addEventListener("selectedFilterChange", this.handleFilterChange, false);
  },
  componentWillUnmount: function() {
    window.removeEventListener("selectedFilterChange", this.handleFilterChange, false);
  },
  handleFilterChange: function(filter) {
   //alert(filter.detail.filterType);
   //Convert Data for getFilteredItems
   //(EventType, Category, Buy, Inspiration) {
   switch (filter.detail.filterType) {
     //alert(filter.detail.filterType);
    case 'category':
      this.setState({
        itemCategory: filter.detail.filterSelected,
      });
      break;
    case 'event':
      this.setState({
        eventType: filter.detail.filterSelected,
      });
      break;
    case 'type':
      if (0){
        this.setState({
          filterBuy: 1,
          filterInspiration: 0,
        });
      }
      if (1){
        this.setState({
          filterBuy: 0,
          filterInspiration: 1,
        });
      }
      if (2){
        this.setState({
          filterBuy: 1,
          filterInspiration: 1,
        });
      }
      break;
    case 'trending':
      this.setState({
        itemCategory: filter.detail.filterSelected,
      });
      break;
   }

   this.getFilteredItems();
 },
  componentDidMount: function() {
    this.listenForFilterChange();
...
  },
  handleScroll:function(e){
...
  },
  componentDidUpdate: function() {
...
  },
  render: function() {
      return (
        <div id="feed-container-inner">
          <GridMain data={this.state.data} />
        </div>

      );
    }
  });

2 个答案:

答案 0 :(得分:2)

setState是异步的,因此更改不会立即反映在状态中:

  

setState()不会立即改变this.state但会创建一个   待定状态转换。调用后访问this.state   方法可以返回现有值。

如果您需要根据状态更改确认状态或执行逻辑,请使用here所述的回调参数。

答案 1 :(得分:0)

不必调用setState两次。阅读你的代码我不能完全推断出错误,但我可以建议:

  1. 如果您想了解其中的内容,请在呈现功能中登录您的状态。
  2. 再次检查您的活动中的内容(触发的是什么情况以及是否真的触发了)。 3.检查另一个函数(另一个setState)是否未覆盖要在handlefilterChange中设置的状态。
  3. 我敢打赌,你的过滤器没有收到正确的值,首先接收未定义的filter.detail.filterSelected然后定义另一个... 检查filter.detail.filterSelected中的内容我在您仅检查过filter.detail.filterType的注释中看到

    无论如何,你的问题不是由于setState,而是来自你的数据,我很确定。

    如果有帮助,请告诉我