【问题标题】:components get render even routed out on componentWillMount method?组件即使在 componentWillMount 方法上也能渲染?
【发布时间】:2018-04-09 16:10:32
【问题描述】:
class LoginScreen extends Component {
  componentWillMount() {
    const { currentUser } = firebase.auth();
    console.log(currentUser);
    if (currentUser) {
      Actions.mainScreen();
    }
  }

  render(){...}
}

基本上这个想法很简单,一旦用户来到LoginScreen,它会检查用户是否存在,如果存在,而不是渲染这个组件,而是重定向到另一个组件。

上述代码的问题在于,LoginScreen 在渲染mainScreen 之前仍然会到达render 1 到2 秒。想知道这是否是在React-Native-Router-Flux 中有条件地处理此类路由的方法?

【问题讨论】:

    标签: react-native navigation react-native-router-flux


    【解决方案1】:

    解决这个问题。声明一个状态

    state = {
       isChecking: true
    }
    

    在你的组件WillMount

    componentWillMount() {
    firebase.auth().onAuthStateChanged(user => {
      if (user) {
        Actions.mainScreen();
      } else {
        this.setState({ isChecking: false });
      }
    });
    } 
    

    或者更好的是使用 async/await 语法

    async componentWillMount() {
    let user = await firebase.auth().onAuthStateChanged;
    user ? Actions.mainScreen() : this.setState({ isChecking: false });
    

    首先在您的渲染方法中,检查您何时仍在检查。如果是这样,只需渲染一个activityIndi​​cator。在渲染方法的最顶端检查您是否仍在检查。

    render() {
    if (this.state.isChecking) {
      return (
        <View
          style={{ justifyContent: "center", alignItems: "center", flex:1 }}
        >
          <ActivityIndicator size={"large"} />
        </View>
      );
       // rest of your loginScreen components
    }
    

    【讨论】:

    • 在您的等待部分,user 将始终被定义,并且在执行控制台日志时,它返回以下日志function r(){var e=Array.prototype.slice.call(arguments);return Hs(o,n,e),t.apply(this,e)}
    • 哦,好吧,我没有测试它。我认为它会起作用。让我编辑我的答案以反映这一变化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2020-02-18
    • 2019-09-01
    • 2019-03-05
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    相关资源
    最近更新 更多