重定向不适用于 componentWillMount() react-native-router-flux

Redirection not working on componentWillMount() react-native-router-flux

componentWillMount() {
    var user = UserService.findAll();
    if (user.length > 0) Actions.home();
  }

其中 'home' 是我 router.js 中的 Scene 键。

另一方面

    onButtonPress() {
        var user = UserService.findAll();
        if (user.length > 0) Actions.home();
      }

工作得很好!

我的router.js

const RouterComponent = () => {
  return (
    <Router showNavigationBar={false}>
      <Stack key="root">
        <Scene key="auth" hideNavBar={true}>
          <Scene key="login" component={Login} />
        </Scene>

        <Scene key="home" component={Home} hideNavBar={true}/>
        <Scene key="pdf" component={Pdf} hideNavBar={true} />
      </Stack>
    </Router>
  );
};

export default RouterComponent;

好的,据我所知,您正在尝试获取或检查 UserService 中用户数据的本地存储。我的建议是不要尝试使用生命周期挂钩 componentWillMount 停止渲染或 "mounting" 组件。相反,您可以在 UserService.findAll() 查找用户(由状态控制)时呈现 ActivityIndicator,因为您不希望在 UserService 完成用户查找过程之前呈现组件。

类似的东西

在您的构造函数中分配一个值,该值将用于呈现 ActivityIndicator 或组件(我假设是 login 组件)。我们称它为 searching 例如:

// in your constructor
this.state = {
  searching : true;
}

// assuming it is an async function
async componentWillMount(){
  var user = await UserService.findAll();
  if (user.length > 0) {
    Actions.home({type : ActionConst.REPLACE}); // no need to update the state here as we will navigate to another screen resetting the navigation stack
  }else {
    this.setState({
      searching : false
    });
  }
}

// other methods etc

render(){
  return this.state.searching ? <ActivityIndicator /> : <Login />
}

当然这是渲染方法的抽象,但你明白了要点:)

on 道具对我有用

我需要条件导航,所以我使用 successfailure 属性以及要导航的场景名称

我在下面发布我的代码,希望它能帮助别人

<Scene
    key="login"
    component={Login}
    on={() => UserService.findAll().length > 0}
    success={()=>
       Actions.replace("home")
    }  
    failure="login"
/>