React-Native setState 不异步更新状态
React-Native setState not updating state asynchronously
import React from 'react';
import {View} from 'react-native';
import Button from 'react-native-button';
const gData = [{counter: 0}];
export default class App extends React.Component {
constructor(props)
{
super(props);
this.state = {data: {}};
console.log("Constructor: ", this.state.data);
}
_handlePress()
{
console.log("Pressed Button")
gData[0].counter += 1;
console.log("Before setState: ", gData);
this.setState({data: gData}, console.log("After setState: ", this.state.data));
}
render() {
return (
<View style={{flex:1, justifyContent: 'center',}}>
<Button
onPress={() => this._handlePress()}>
Press Me!
</Button>
</View>
);
}
}
嗨,
我有一个用于本机反应应用程序的简单代码,它在屏幕上创建一个按钮,按下它应该更新对象内的计数器并将对象存储在状态中。但是,当我 运行 应用程序并按下按钮时,我在日志中得到了这个:
11:19:43 PM:运行 Android 为 x86_64
构建的 SDK 上的应用
11:19:43 PM:构造函数:{}
下午 11:23:20:按下按钮
11:23:20 PM:setState 之前:[{"counter":1}]
11:23:20 PM:setState 之后:{}
所以由于某种原因状态没有更新。有谁知道是怎么回事吗?
很确定如果你这样调用 console.log 它将立即被调用,而不是一旦状态完成更新,尝试将其放入匿名函数中:
this.setState({data: gData}, () => console.log("After setState: ", this.state.data));
import React from 'react';
import {View} from 'react-native';
import Button from 'react-native-button';
const gData = [{counter: 0}];
export default class App extends React.Component {
constructor(props)
{
super(props);
this.state = {data: {}};
console.log("Constructor: ", this.state.data);
}
_handlePress()
{
console.log("Pressed Button")
gData[0].counter += 1;
console.log("Before setState: ", gData);
this.setState({data: gData}, console.log("After setState: ", this.state.data));
}
render() {
return (
<View style={{flex:1, justifyContent: 'center',}}>
<Button
onPress={() => this._handlePress()}>
Press Me!
</Button>
</View>
);
}
}
嗨, 我有一个用于本机反应应用程序的简单代码,它在屏幕上创建一个按钮,按下它应该更新对象内的计数器并将对象存储在状态中。但是,当我 运行 应用程序并按下按钮时,我在日志中得到了这个:
11:19:43 PM:运行 Android 为 x86_64
构建的 SDK 上的应用11:19:43 PM:构造函数:{}
下午 11:23:20:按下按钮
11:23:20 PM:setState 之前:[{"counter":1}]
11:23:20 PM:setState 之后:{}
所以由于某种原因状态没有更新。有谁知道是怎么回事吗?
很确定如果你这样调用 console.log 它将立即被调用,而不是一旦状态完成更新,尝试将其放入匿名函数中:
this.setState({data: gData}, () => console.log("After setState: ", this.state.data));