[英]ReactJS - how do I update nested and “normal” state properties?
这是我的state
:
constructor(props, context) {
super(props, context);
this.state = {
show: false,
btnLabel: 'GO!',
car: {
owner: false,
manufacturer: false,
color: false
}
};
}
这就是我修改state
:
handleClickFetchPrice() {
this.setState({btnLabel: 'Fetching data...' });
console.log(this.state.fetchPriceBtn);
const url = 'some url';
axios.get(url)
.then(res => {
let car = [...this.state.car];
car.owner = res.data.owner;
car.manufacturer = res.data.manufacturer;
car.color = res.data.color;
this.setState({car});
})
}
属性car
已更新,但fetchPriceBtn
不是fetchPriceBtn
console.log(this.state.fetchPriceBtn);
的输出console.log(this.state.fetchPriceBtn);
还是GO!
。
我在俯视什么? 为什么fetchPriceBtn
没有更新?
@christopher是正确的, setState
是一个异步过程。 但是当第二次调用handleClickFetchPrice()
函数时,您的btnLabel
值等于Fetching data...
正如先前答案中回答的那样,setState是异步的,因此您的console.log无法立即赶上状态更改。 再次建议,您可以使用回调函数来跟踪此更改,但是,如果仅将console.log用于调试或想查看状态的更改,则可以在渲染函数中执行此操作。 而且仅将回调用于调试不是一个好方法。 它的用途有所不同,如果您查看官方文档,则建议将componentDidMount方法用于这种逻辑。
render() {
console.log( this.state.foo );
return (...)
}
如果这样做,您会看到两个console.log输出,一个在状态更改之前,另一个在状态更改之后。
此外,您的状态操作可能会得到增强。 您的汽车属性不是数组,但是您要将其转换为数组并进行设置? 这是您打算的吗?
axios.get(url)
.then(res => {
const { owner, manufacturer, color } = res.data;
this.setState( prevState => ( { car: { ...prevState.car, owner, manufacturer, color } } ) );
})
这里我们不是直接改变状态,而是使用散布运算符并设置所需的属性。 对于您的示例,我们实际上是在设置整个属性。
最后一点,我想您想这样做:
this.setState( { btnLabel: "fetching } );
axios.get(url)
.then(res => {
const { owner, manufacturer, color } = res.data;
this.setState( prevState => ( { car: { ...prevState.car, owner, manufacturer, color }, btnLabel: "go" } ) );
})
如果您打算以某种方式进行状态更改/检查,那么这可能不是一个好的逻辑,因为您已经看到setState不同步。 仔细做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.