为什么React SetState无法按预期工作?

时间:2019-05-15 07:49:43

标签: arrays reactjs promise

我的React组件中有以下代码: (__loadItems()返回一个Promise。)

componentDidMount(){
    const self=this;
    this.__loadItems().then((itemsCollection) => {
        // below will log what I expect:
        console.log('itemsCollection', itemsCollection);

        self.setState( (state, props) => {


             return {
                 itemTypes: itemsCollection,
             };
        }, () => {
        //below will contain what expected
        console.log(self.state.itemTypes);
        //ISSUE: state.itemTypes will be Array(0)
        console.log(self.state);

        // });
    });
}

为什么我的状态itemTypes不能按预期设置?

 console.log(self.state)

将输出:

 { itemTypes: Array(0)}

2 个答案:

答案 0 :(得分:0)

对我来说这只是简单的作品,我看不到问题。回调还会记录这些项目。

const loadItems = () => (
  new Promise(resolve => {
    setTimeout(() => resolve(['item1', 'item2']), 1500);
  })
)

class App extends React.Component { 
  state = { items: [] };
  
  componentDidMount(){
    loadItems().then(items => this.addItemsToState(items))
  }
  
  addItemsToState = items => {
    this.setState({ items }, console.log(items))
  }
  
  render() {
    const { items } = this.state;
    return <ul>{items.map(item => <li>{item}</li>)}</ul>
  }
}

ReactDOM.render(<App />, document.getElementById('root'));

  
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id="root"></div>

答案 1 :(得分:0)

该问题与控制台日志本身有关。 我正在使用Google chrome,似乎打印的console.log json对象的预览是 指加载前的初始状态。使用空数组:

  { itemTypes: Array(0)}

我没有尝试扩展此预览,因为我希望Array(0)里面什么也看不到。

即使声明了Array(0),也可以通过扩展所需的有效负载响应来实现。

棘手和令人困惑。