在状态中输入所有数据后,我想将state.loading
更改为false
。
我要创建如下的Web工作流程:
state
,其loading
条件设置为true axios
提取3个JSON文件并将其保存到state
中。state
中,则将state.loading
更改为false
但是我得到的是state.loading
在所有数据被调用之前被声明为false
。
代码如下:
constructor(props) {
super(props);
this.state = {
jobs : [],
category: [],
location: [],
loading : true
}
}
componentWillMount() {
window.scrollTo(0, 0);
//get any jobs available
axios.get('/thisjob/all/all').then(({data}) => this.setState({
jobs: [...data.jobs]
}));
//get any categories available
axios.get('/thiscategory').then(({data}) => this.setState({
category: [...data.category]
}));
//get any locations available
axios.get('/thislocation').then(({data}) => this.setState({
location: [...data.location]
}));
this.setState({
loading: false
})
}
这是我在console.log()
的{{1}}-ing状态下找到的屏幕截图
我尝试了多种方式,从使用if语句到尝试将其保存到另一个生命周期方法中,但结果仍然不像我要求的工作流程。
答案 0 :(得分:2)
您可能想要使用异步等待方法或全部承诺。
一旦所有promy解决,您将setState加载为false。
await Promise.all([someCall(), anotherCall()]);
就像有人指出的那样,在componentDidMount中进行抓取并添加异步
async componentDidMount() {
const res = await axios.get('/thisjob/all/all');
const {ip} = await res.json(); // do other logic
const res1 = await axios.get('/thiscategory');
const {other} = await res1.json(); // do other logic
const res2 = await axios.get('/thislocation');
const {other2} = await res2.json(); // do other logic
await this.setStateAsync({loading: false})
}