Reactjs 无论设置为同步,都无法设置状态

Reactjs 无论设置为同步,都无法设置状态,reactjs,async-await,axios,setstate,Reactjs,Async Await,Axios,Setstate,我正在学习如何使用synchronoussetState,但它不适用于我的项目。我想在从Axios获得列表信息后更新状态,但它不起作用,res.data工作正常 class ListingItem extends Component { constructor(props) { super(props); this.state = { listingInfo: {}, open: false, }; this.getListingDat

我正在学习如何使用synchronous
setState
,但它不适用于我的项目。我想在从Axios获得
列表信息后更新状态,但它不起作用,
res.data
工作正常

class ListingItem extends Component {
  constructor(props) {
    super(props);
    this.state = {
      listingInfo: {},
      open: false,
    };
    this.getListingData(this.props.itemId);
  }

  setStateSynchronous(stateUpdate) {
    return new Promise((resolve) => {
      this.setState(stateUpdate, () => resolve());
    });
  }

  getListingData = async (item_id) => {
    try {
      const res = await axios.get(`http://localhost:5000/api/items/${item_id}`);
      console.log(res.data);//it's working
      await this.setStateSynchronous({ listingInfo: res.data });
      // this.setState({
      //   listingInfo: res.data,
      // });
      
      console.log(this.state.listingInfo);//no result
    } catch (err) {
      setAlert('Fail to obtain listings', 'error');
    }
  };


我将非常感谢你的帮助

感谢@PrathapReddy!在
setState
完成之前,我使用了条件渲染来防止数据渲染。我在渲染部分添加了这行代码:

render() {
    if (Object.keys(this.state.listingInfo).length === 0) {
      return (
        <div>
          Loading
        </div>
      );
    } else {
      return //put what you want to initially render here
    }
}
render(){
if(Object.keys(this.state.listingInfo).length==0){
返回(
加载
);
}否则{
return//将最初要渲染的内容放在此处
}
}

此外,无需修改
setState
,正常的
setState
即可。希望这是有用的

我们无法控制React的
setState
行为。顺便说一句,通过同步设置状态,您想要实现什么?您可以使用这种方法隐藏UI组件,直到提取API数据为止。@PrathapReddy我只想让setState工作,因为当前,它根本不工作,因为在您的“应该工作”中注释的行。但是您不会在
setState
之后立即看到数据,因为
状态更新是异步的。若在返回块中使用该数据,组件将在UI中重新提交该数据。它对你不起作用吗?是的,它已经起作用了。非常感谢你!我按照您的建议使用条件渲染和注释区域