Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Navigate is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment> [duplicate]

I want to redirect to another page in react if the user is not logged in and no token is set. For this im trying to use the Navigate option from react-router-dom Version: 6.0.2 like the old Redirect option. But i get the Error: [Navigate] is not a component. All component children of must be a or <React.Fragment>.

import "./App.css";
import { BrowserRouter, Route, Routes, Navigate } from "react-router-dom";

import AuthPage from "./pages/Auth";
import CompetitionPage from "./pages/Competitions";
import ConditionsPage from "./pages/Conditions";
import JudgesPage from "./pages/Judges";
import StartPage from "./pages/Start";
import WinnersPage from "./pages/Winners";
import AuthContext from "./context/auth-context";
import SubmissionPage from "./pages/Submission";

import MainNavigation from "./components/navigation/MainNavigation.js";
import React, { Component } from "react";

class App extends Component {
  state = {
    token: null,
    userId: null,
  };

  login = (token, userId, tokenExpiration) => {
    this.setState({ token: token, userId: userId });
  };

  logout = () => {
    this.setState({ token: null, userId: null });
  };

  render() {
    return (
      <BrowserRouter>
        <React.Fragment>
          <AuthContext.Provider
            value={{
              token: this.state.token,
              userId: this.state.userId,
              login: this.login,
              logout: this.logout,
            }}
          >
            <MainNavigation />
            <main className="main-content">
              <Routes>
                {!this.state.token && <Navigate from="/" to="/auth" exact />}
                {this.state.token && (
                  <Navigate from="/" to="/competition" exact />
                )}
                {this.state.token && (
                  <Navigate from="/auth" to="/competition" exact />
                )}
                <Route exact path="/" element={StartPage} />
                {!this.state.token && <Route path="/auth" element={AuthPage} />}
                <Route path="/competition" element={CompetitionPage} />
                {this.state.token && (
                  <Route path="/submission" element={SubmissionPage} />
                )}
                <Route path="/conditions" element={ConditionsPage} />
                <Route path="/judges" element={JudgesPage} />
                <Route path="/winners" element={WinnersPage} />
              </Routes>
            </main>
          </AuthContext.Provider>
        </React.Fragment>
      </BrowserRouter>
    );
  }
}

export default App;

Im not sure how to use the "Navigate" property since i looked it up and found a answer which said i only have to replace the old "Redirect" property with "Navigate".

like image 755
JayDi Avatar asked Nov 30 '21 15:11

JayDi


People also ask

How do I navigate with react router?

The react-router-dom package makes it simple to create new routes. To begin, you wrap the entire application with the <BrowserRouter> tag. We do this to gain access to the browser's history object. Then you define your router links, as well as the components that will be used for each route.

What is a component route?

Any component passed as a child to <Router> is called a “Route Component”. There are three types of props for Route Components. Matching Props - You provide these props where the <Router> is rendered. They are used by Router to match the component against the location to see if the component should be rendered.

Which component renders first child route that matches the location?

The switch component looks through all of its child routes and it displays the first one whose path matches the current URL.

What is the different between render and component in the route component?

render makes the component mount just once, then re-render when required. The component stays in the background — this means that anything you put in componentDidMount , constructor , or, for example, shouldComponentUpdate , will run only once!


Video Answer


1 Answers

As long as i know, in react-router v6 <Route> it's the only component that's able to be child of <Routes>

you can change this code

{this.state.token && (<Navigate from="/auth" to="/competition" exact />)}

to

<Route path="/auth" element={this.state.token ? <Navigate to="/competition" /> : AuthPage}
like image 169
wisnuaryadipa Avatar answered Oct 26 '22 01:10

wisnuaryadipa