我可以在componentDidMount中的诺言中合法使用setState吗?

时间:2019-07-13 02:16:44

标签: javascript reactjs

我希望避免这种无法通过其他方式调试的警告:警告:无法在现有状态转换期间(例如在render内进行更新)。渲染方法应该纯粹是props和state的函数。

由于一些数据调用的排序,我目前有一组相当嵌套的Promise。似乎警告的来源是我为itemData设置状态的行,例如(this.setState({... itemData ...)。

这不是设置状态的有效方法吗? (我删除了一些数据以便于阅读,例如将变量设置为1、2、3

componentDidMount() {
    if(this.state.category && this.state.item){
      let { category, item, user, filter, filterVar } = this.state;
      var metaPromise = this.props.firebase.getItemMeta(category, item)
      .then(itemData => {
        let itemCollections = 1
        let subscribers = 2
        let reviewCount = 3

        this.setState({...itemData, itemCollections, itemData, subscribers, reviewCount }) //itemCollections is in itemData... why?
        return itemData
      })
      .then(() => {
        if( !user ){
          return []
        }
        return this.props.firebase.getUserCollectionsForItem(user.uid, category, item)
      })
      .then(userCollections => {
         this.setState({ userCollections })
      })
      .catch(error => {
        console.log("Error getting item data", error);
        return null;
      });


      Promise.all([metaPromise]).then(values => {
        //Do stuff here

        }).catch(error => {
          console.log(error)
          return Promise.reject(new Error("Error building collections", error));
        });
    }
}

0 个答案:

没有答案