反应本机 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 之前,上述所有逻辑都会 运行。