Как перенаправить в реактивном маршрутизаторе, когда маршруты находятся в разных файлах

Я пытался перенаправить на страницу входа, если пользователь не вошел в систему. Он работал нормально, когда я использовал маршруты в App.js, но после создания отдельного файла для маршрутизации я не стал.

маршрут.js

import React from 'react';
import Login from './Login';
import Register from './Register';
import Home from './Home';
import './style.css';
import { Route, Switch } from 'react-router-dom';

const routes = (
        <Switch>
            <Route key = "0" path = "/" exact render = { props => <Home {...props} />} />
            <Route key = "1" path = "/login" render = { props => <Login {...props} />} />
            <Route key = "2" path = "/register" render = { props => <Register {...props} />}  />
            <Route key = "2" path = "/home"  render = { props => <Home {...props} /> } />
        </Switch>
        );

export default routes;

App.js

class App extends Component {
  state = {
    isLogin:false
  }
  render() {
    return (

      <div className = "App">
      <Router>
      <Header/>
    <div className = "container">
      {routes}

    </div>
    </Router>

      </div>
    );
  }
}

Мои предыдущие условия разгрома были

const routes = (
           <Switch>
            <Route key = "0" path = "/" exact render = { () => this.state.login ? ( <Home/> ): ( <Redirect to = "/login"/> )} />} />
            <Route key = "1" path = "/login" render = { props => <Login {...props} />} />
            <Route key = "2" path = "/register" render = { props => <Register {...props} />}  />
            <Route key = "2" path = "/home"  render = { () => this.state.login ? ( <Home/> ): ( <Redirect to = "/login"/> )} />
          </Switch>
        );

Поэтому я хочу, чтобы эти маршруты работали.

ничего плохого, просто вам нужно импортировать routes и импорт, который в app.js импортирует маршруты из './route' и использует <Routes> <Header/><Routes/>

pageNotfoUnd 09.04.2019 11:30
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
1 117
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я сделал небольшую песочницу, чтобы показать вам, как это сделать, мы создаем маршруты как функцию, которая принимает состояние isLogin из App, и на основе этого значения мы визуализируем нужный компонент.

const Home = () => <h1>Home</h1>;
const Login = () => <h1>Login</h1>;
const Register = () => <h1>Register</h1>;

const Nav = () => (
  <div>
    <Link to = "/">Home</Link>
    <Link to = "/login">Login</Link>
    <Link to = "/register">Register</Link>
  </div>
);
// Takes isLogged from this.state
const routes = isLogged => (
  <Switch>
    <Route
      path = "/"
      exact
      render = {() => (isLogged ? <Home /> : <Redirect to = "/login" />)}
    />
    } />
    <Route path = "/login" render = {props => <Login {...props} />} />
    <Route path = "/register" render = {props => <Register {...props} />} />
    <Route
      path = "/home"
      render = {() => (isLogged ? <Home /> : <Redirect to = "/login" />)}
    />
  </Switch>
);

class App extends Component {
  state = {
    isLogin: false
  };

  toggleLogin = () =>
    this.setState(prevState => ({
      isLogin: !prevState.isLogin
    }));

  render() {
    const { isLogin } = this.state;

    return (
      <Router>
        <div className = "App">
          <button onClick = {this.toggleLogin}>Toggle Login</button>
          <Nav />
          <h1>{`isLogin ${isLogin}`}</h1>
          {/* invoke routes with isLogin */}
          {routes(isLogin)}
        </div>
      </Router>
    );
  }
}

Песочница

Другие вопросы по теме