反应本机 this.setState 不工作
react-native this.setState not working
我知道已经有一个类似的问题,但那里没有共享代码。
在 navbarChanged()
> if 条件下,我正在做 this.setState
。这是 HomeTab
类型,但 setState
似乎不起作用。
任何clues/pointers?
class HomeTab extends React.Component {
constructor() {
super()
this.setState({
isNavBarHidden: false
});
}
updatePosition(lastPosition) {
}
navbarChanged() {
console.log("received navbar changed event", AppStore.navbarVisible());
if (AppStore.navbarVisible()) {
StatusBarIOS.setHidden(false)
this.setState({ isNavBarHidden: false})
// this.state.isNavbarHidden is still true here
this.render();
}
else {
StatusBarIOS.setHidden(true);
this.setState({ isNavBarHidden: true});
this.render();
}
}
componentDidMount() {
AppStore.addNavbarChangeListener( this.navbarChanged.bind(this) );
}
componentWillMount() {
StatusBarIOS.setHidden(false)
this.setState({ isNavBarHidden: false });
}
}
这是我的 render() 代码:
render() {
return (
<NavigatorIOS style={styles.container}
navigationBarHidden={this.state.isNavBarHidden}
ref="navigator"
initialRoute={{
title: 'Foo',
component: HomeScreen,
passProps: { parent: this }
}}
/>
)
}
不要显式调用 render
。当 state 或 props 改变时,React 会自动重新渲染,所以没有必要这样做。另外,您实际的 render
方法在哪里?
至于您的问题,setState
是异步的,因此尝试在 setState
调用后直接使用状态是行不通的,因为更新不一定有 运行.相反,您可以使用 setState
的第二个参数,这是一个回调:
this.setState({ myVal: 'newVal'}, function() {
// do something with new state
});
这将在设置状态和重新渲染组件后触发。
使用 state 作为 es6 的实例成员而不是 setState class。稍后可以自己调用函数 setState 以确保必要的重新渲染。
constructor() {
super()
this.state = {
isNavBarHidden: false
};
}
您还可以在 eventHandlers 中更新状态并监听 componentWillReceiveProps
状态更改后需要 运行 的代码。
componentWillReceiveProps(nextProps,nextState){
if(this.state.myVar === nextState.myVar){
return;
}
// TODO perform changes on state change
}
我认为它比上面 Colin Ramsay
给出的解决方案更优化,因为在调用 render
之前,上述所有逻辑都会 运行。
我知道已经有一个类似的问题,但那里没有共享代码。
在 navbarChanged()
> if 条件下,我正在做 this.setState
。这是 HomeTab
类型,但 setState
似乎不起作用。
任何clues/pointers?
class HomeTab extends React.Component {
constructor() {
super()
this.setState({
isNavBarHidden: false
});
}
updatePosition(lastPosition) {
}
navbarChanged() {
console.log("received navbar changed event", AppStore.navbarVisible());
if (AppStore.navbarVisible()) {
StatusBarIOS.setHidden(false)
this.setState({ isNavBarHidden: false})
// this.state.isNavbarHidden is still true here
this.render();
}
else {
StatusBarIOS.setHidden(true);
this.setState({ isNavBarHidden: true});
this.render();
}
}
componentDidMount() {
AppStore.addNavbarChangeListener( this.navbarChanged.bind(this) );
}
componentWillMount() {
StatusBarIOS.setHidden(false)
this.setState({ isNavBarHidden: false });
}
}
这是我的 render() 代码:
render() {
return (
<NavigatorIOS style={styles.container}
navigationBarHidden={this.state.isNavBarHidden}
ref="navigator"
initialRoute={{
title: 'Foo',
component: HomeScreen,
passProps: { parent: this }
}}
/>
)
}
不要显式调用 render
。当 state 或 props 改变时,React 会自动重新渲染,所以没有必要这样做。另外,您实际的 render
方法在哪里?
至于您的问题,setState
是异步的,因此尝试在 setState
调用后直接使用状态是行不通的,因为更新不一定有 运行.相反,您可以使用 setState
的第二个参数,这是一个回调:
this.setState({ myVal: 'newVal'}, function() {
// do something with new state
});
这将在设置状态和重新渲染组件后触发。
使用 state 作为 es6 的实例成员而不是 setState class。稍后可以自己调用函数 setState 以确保必要的重新渲染。
constructor() {
super()
this.state = {
isNavBarHidden: false
};
}
您还可以在 eventHandlers 中更新状态并监听 componentWillReceiveProps
状态更改后需要 运行 的代码。
componentWillReceiveProps(nextProps,nextState){
if(this.state.myVar === nextState.myVar){
return;
}
// TODO perform changes on state change
}
我认为它比上面 Colin Ramsay
给出的解决方案更优化,因为在调用 render
之前,上述所有逻辑都会 运行。