即使在 setState 回调中,解构状态也不会更新
Deconstructed state is not updated even in the setState callback
存在一个问题,即解构组件的状态会阻止它在 setState 中更新:
state = {
value: 'test',
values: ['a', 'b', 'c'],
};
...
const { value, values } = this.state;
this.setState(
{
values: [...values, value],
},
() => {
console.log(values);
// this logs ["a", "b", "c"] rather than ["a", "b", "c", "test"]
}
);
值的预期输出应该包含新值,但它只记录旧值。使用 "this.state" 很有效,所以只是想知道为什么解构状态对象似乎无法正确更新?
如果您单击按钮并检查控制台日志,您可以转到此 Codesandbox 并亲自尝试一下。
如有任何帮助,我们将不胜感激!
假设如下:
state = {value: 0}
foo = () =>{
const { value } = this.state
this.setState({value : value + 1}, () => console.log(value)) //0
}
发生这种情况是因为 value
保留了调用方法 foo()
时的状态值,即使在状态更新后 const
的值也不会改变,因为它是相当于:const value = this.state.value
。它是这个值曾经是什么的参考。在这种情况下使用 state
的全局实例来访问更新后的值
this.setState({value : value + 1}, () => console.log(this.state.value))//1
也许你可以尝试这样的事情:
state = {
value: 'test',
values: ['a', 'b', 'c'],
};
this.setState(oldState =>
const { value, values } = oldState;
return {
values: [...values, value],
},
() => {
console.log(values);
// this logs ["a", "b", "c"] rather than ["a", "b", "c", "test"]
}
);
在您的示例中,您试图打印状态的旧值,即刚刚在 setState 之前发生的值。因此,您基本上是将值设置为过去的值。 setState 实际上还有一个回调函数,您可以从中提取旧状态。在那里你可以解构值等。试试看,祝你好运!
存在一个问题,即解构组件的状态会阻止它在 setState 中更新:
state = {
value: 'test',
values: ['a', 'b', 'c'],
};
...
const { value, values } = this.state;
this.setState(
{
values: [...values, value],
},
() => {
console.log(values);
// this logs ["a", "b", "c"] rather than ["a", "b", "c", "test"]
}
);
值的预期输出应该包含新值,但它只记录旧值。使用 "this.state" 很有效,所以只是想知道为什么解构状态对象似乎无法正确更新?
如果您单击按钮并检查控制台日志,您可以转到此 Codesandbox 并亲自尝试一下。
如有任何帮助,我们将不胜感激!
假设如下:
state = {value: 0}
foo = () =>{
const { value } = this.state
this.setState({value : value + 1}, () => console.log(value)) //0
}
发生这种情况是因为 value
保留了调用方法 foo()
时的状态值,即使在状态更新后 const
的值也不会改变,因为它是相当于:const value = this.state.value
。它是这个值曾经是什么的参考。在这种情况下使用 state
的全局实例来访问更新后的值
this.setState({value : value + 1}, () => console.log(this.state.value))//1
也许你可以尝试这样的事情:
state = {
value: 'test',
values: ['a', 'b', 'c'],
};
this.setState(oldState =>
const { value, values } = oldState;
return {
values: [...values, value],
},
() => {
console.log(values);
// this logs ["a", "b", "c"] rather than ["a", "b", "c", "test"]
}
);
在您的示例中,您试图打印状态的旧值,即刚刚在 setState 之前发生的值。因此,您基本上是将值设置为过去的值。 setState 实际上还有一个回调函数,您可以从中提取旧状态。在那里你可以解构值等。试试看,祝你好运!