Reactjs 无论设置为同步,都无法设置状态
我正在学习如何使用synchronousReactjs 无论设置为同步,都无法设置状态,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
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中重新提交该数据。它对你不起作用吗?是的,它已经起作用了。非常感谢你!我按照您的建议使用条件渲染和注释区域