как перенаправить с помощью реакции роутера - PullRequest
1 голос
/ 30 мая 2019

Превышена максимальная глубина обновления.Это может произойти, когда компонент повторно вызывает setState внутри componentWillUpdate или componentDidUpdate.React ограничивает количество вложенных обновлений для предотвращения бесконечных циклов.

  import React, { Component } from "react";
  import { BrowserRouter, Route, Redirect, Switch } from "react-router-dom"; 
  import Login from "./component/auth/Login";
  import HomeScreen from "./component/home-screen/HomeScreen";
       class App extends Component {
           constructor(props) {
            super(props);

              this.state = {
                   user: {}
                 };
                 }

              componentDidMount() {
                    this.authListener();
               }

     authListener() {
firebase.auth().onAuthStateChanged(user => {
  if (user) {
    this.setState({ user });
  } else {
    this.setState({ user: null });
  }
});
}

render() {
  return (
  <BrowserRouter>
    <div className="App">
      <Switch>
        <Route exact path="/" component={Landing} />
        {this.state.user ? (
          <Redirect to="/homescreen" />
        ) : (
          <Redirect to="/login" />
        )}
        <Route exact path="/login" component={Login} />
        <Route exact path="/homescreen" component={HomeScreen} />
        <Route exact path="/users" component={Users} />
        <Route exact path="/users/:id" component={UserDetail} />
        <Route component={Error} />
      </Switch>
    </div>
  </BrowserRouter>
);
}
}

 export default App;

Ответы [ 2 ]

1 голос
/ 30 мая 2019

реагирует маршрутизатор v4 + поддерживает использование PrivateRoute.

// create a private route, if user is not logged in redirect to login page
const PrivateRoute = ({ component: Component, ...rest }) => (
  <Route {...rest} render={(props) => (
      isAuthenticated() === true
        ? <Component {...props} />
        : <Redirect to='/login' />
  )} />
)

Используйте его как обычный маршрут и проверьте аутентификацию на частном маршруте.

<BrowserRouter>
  <Route path="/login" exact component={FormularAuth} />
  <PrivateRoute path='/private' component={Private} />
</BrowserRouter>

Демо

0 голосов
/ 30 мая 2019

//App.js 
class App extends Component {
  constructor(props) {
    super(props);
    this.state = {
      user: ""
    };
  }

  componentDidMount() {
    this.authListener();
  }

  authListener() {
    firebase.auth().onAuthStateChanged(user => {
      if (user) {
        this.setState({
          user
        });
      } else {
        this.setState({
          user: null
        });
      }
    });
  }

  render() {
    return (
    <BrowserRouter>
    <div className="App">
      <Switch>
        <Route exact path="/" component={(props)=><Landing {...props} users = {this.state.user}/>}/>
        <Route exact path="/login" component={Login} />
        <Route exact path="/homescreen" component={HomeScreen} />
      </Switch>
    </div>
  </BrowserRouter>
    );
  }
}

export default App;

в вашем компоненте посадки проверьте пользовательское значение и перейдите к соответствующим маршрутам.

//Landing.js
class Landing extends Component {
  componentDidMount() {
    if (this.props.users) {
      this.props.history.push("homescreen")
    } else if (this.props.users === null) {
      this.props.history.push("login")
    }
  }
  render() {
    return (
      <div>
        <h1>landing page</h1>
      </div>
    );
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...