`No routes matched location "/" ` warning shown on the console - reactjs

I am trying to implement a small project and got an error/warning like above title.
Here is my Index.jsx:
import React, { Suspense } from "react";
import ReactDOM from "react-dom";
import { Provider } from "react-redux";
import { BrowserRouter} from "react-router-dom";
import { App } from "./components/app";
ReactDOM.render(
<React.StrictMode>
<Provider store={store}>
<Suspense fallback={<div>Loading...</div>}>
<BrowserRouter>
<App />
</BrowserRouter>
</Suspense>
</Provider>
</React.StrictMode>,
document.getElementById("root")
);
App.jsx:
import React, { useEffect } from "react";
import { makeStyles } from "#material-ui/core/styles";
import { Container } from "#material-ui/core";
import { ToastContainer } from "react-toastify";
import { Route, Routes } from "react-router-dom";
import { useSelector, useDispatch } from "react-redux";
import Sidebar from "../sidebar/Sidebar";
import TopNav from "../topnav/TopNav";
import { AppRoutes } from "../AppRoutes";
import ThemeAction from "../../store/actions/ThemeAction";
import "./App.scss";
const useStyles = makeStyles({
contentStyle: {
margin: "30px auto",
},
});
export const App = () => {
const themeReducer = useSelector((state) => state.ThemeReducer);
const classes = useStyles();
const dispatch = useDispatch();
useEffect(() => {
const themeClass = localStorage.getItem("themeMode", "theme-mode-light");
const colorClass = localStorage.getItem("colorMode", "theme-mode-light");
dispatch(ThemeAction.setMode(themeClass));
dispatch(ThemeAction.setColor(colorClass));
}, [dispatch]);
return (
<Routes>
<Route
render={(routeProps) => (
<div className={`app ${themeReducer.mode} ${themeReducer.color}`}>
<Sidebar routeProps={routeProps} />
<div className="app__content">
<TopNav />
<div className="app__content-main">
<ToastContainer />
<Container className={classes.contentStyle} maxWidth="sm">
<AppRoutes />
</Container>
</div>
</div>
</div>
)}
/>
</Routes>
);
};
And AppRoutes.jsx:
import React from "react";
import { Route, Routes } from "react-router-dom";
import Customers from "../pages/Customers";
import { Dashboard } from "../pages/Dashboard";
import { UserLogin } from "./User/Login";
import { UserSignup } from "./User/Signup/UserSignup";
export const AppRoutes = () => {
return (
<Routes>
<Route index path="/" element={<Dashboard />} />
<Route path="customers" component={<Customers />} />
<Route path="userLogin" element={<UserLogin />} />
<Route path="userSignup" element={<UserSignup />} />
</Routes>
);
};
And the project is not running) I mean white blank on browser window while there is no error except index.tsx:25 No routes matched location "/" .

In react-router-dom#6 there are no longer any render (or component or children function props). Remove the Routes and Route component in App. You will also update Sidebar to access the location object via hook.
App
return (
<div className={`app ${themeReducer.mode} ${themeReducer.color}`}>
<Sidebar routeProps={routeProps} />
<div className="app__content">
<TopNav />
<div className="app__content-main">
<ToastContainer />
<Container className={classes.contentStyle} maxWidth="sm">
<AppRoutes />
</Container>
</div>
</div>
</div>
);
Sidebar
const Sidebar = () => {
const location = useLocation();
const activeItem = sidebar_items.findIndex(
(item) => item.route === location.pathname
);
return (
<div className="sidebar">
<div className="sidebar__logo">
<img src={logo} alt="company logo" />
</div>
{sidebar_items.map((item, index) => (
<Link to={item.route} key={index}>
<SidebarItem
title={item.display_name}
icon={item.icon}
active={index === activeItem}
/>
</Link>
))}
</div>
);
};
AppRoutes
Remove the index prop from the "/" route. When you specify an index route the path prop is ignored. Also, make sure all the routes are correctly using the element prop.
<Routes>
<Route path="/" element={<Dashboard />} />
<Route path="customers" element={<Customers />} />
<Route path="userLogin" element={<UserLogin />} />
<Route path="userSignup" element={<UserSignup />} />
</Routes>

Related

when passing data logs undefined

The problem is really simple. I fetched the data and stored it in state. When passing to other components it logs okay, on a second render I get what I want(array of objects). But when I pass the same array to Fahrzeugdaten component, I get undefined on a second render.
PS. No need to write about different ways of state management, I need a simple answer.
import React, { useState, useEffect } from 'react';
import axios from 'axios';
import {
Datenschutz,
Fahrzeugangebote,
Fahrzeugankauf,
Finanzierung,
Galerie,
Home,
Impressum,
Kontakt,
Fehler404,
Fahrzeugdaten,
} from './pages';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import './App.css';
const App = () => {
const [carsList, setCarsList] = useState();
useEffect(() => {
fetchCars();
}, []);
const fetchCars = async () => {
try {
const res = await axios.get(url);
const data = res.data;
setCarsList(data);
} catch (error) {
console.log(error.response.data.error);
}
};
return (
<Router>
<Routes>
<Route path='/' element={<Home />} />
<Route path='/datenschutz' element={<Datenschutz />} />
<Route
path='/fahrzeugangebote'
element={<Fahrzeugangebote />}
/>
<Route path='/fahrzeugankauf' element={<Fahrzeugankauf />} />
<Route path='/finanzierung' element={<Finanzierung />} />
<Route path='/galerie' element={<Galerie />} />
<Route path='/impressum' element={<Impressum />} />
<Route path='/kontakt' element={<Kontakt />} />
<Route path='*' element={<Fehler404 />} />
<Route path='/fahrzeugdaten/:id'
element={<Fahrzeugdaten carsList={carsList} />}/>
</Routes>
</Router>
);
};
export default App;
Fahrzeugdaten component:
import React from 'react';
import { Header, Navbar, Jumbotrone, Logo, CarPage } from '../components';
const Fahrzeugdaten = ({ carsList }) => {
return (
<>
<div id='header-img-id' className='header-img-div'>
<Header />
<Navbar />
<div className='mka__logo-img'>
<div className='mka__logo-size'>
<Logo />
</div>
</div>
<div className='mka__title-wrapper'>
<div className='mka__container'>
<h1 className='mka__title'>FAHRZEUGDATEN</h1>
</div>
</div>
</div>
<div>
<CarPage />
</div>
<Jumbotrone />
</>
);
};
export default Fahrzeugdaten;

ReferenceError: Worker is not defined while testing AppRouter Component

I am testing a React/Typescript component using Jest and React Testing-Library. I am doing a simple render test and getting a Reference Error: Worker is not defined.
Why and how would I use a worker in this testing context?
Here is my simple test:
import {render, screen} from '#testing-library/react'
import userEvent from '#testing-library/user-event'
import React from 'react'
import {Router} from 'react-router-dom'
import AppRouter from '../router'
test('AppRouter renders all routes and I can navigate to those pages', () => {
render(<AppRouter />)
screen.debug()
})
And here is the AppRouter component:
import { BrowserRouter, Switch, Route, Redirect } from 'react-router-dom'
import { useState } from 'react'
import useLocalStorage from './hooks/useLocalStorage'
import * as Constants from './constants'
import Header from './layout/header/header'
import MainPage from './pages/mainPage/mainPage'
import PostPage from './pages/postPage/postPage'
import UserPage from './pages/userPage/userPage'
import LoginPage from './pages/loginPage/loginPage'
import SignupPage from './pages/signupPage/signupPage'
import NewPage from './pages/newPage/newPage'
import FeedbackPage from './pages/feedbackPage/feedbackPage'
import AdminPage from './pages/adminPage/adminPage'
import SettingPage from './pages/settingPage/settingPage'
import { WebContext } from './context/WebContext'
import Favicon from 'react-favicon'
const AppRouter = () => {
const [adminCode, setAdminCode] = useLocalStorage('admin', '')
const [isMenuOpen, setIsMenuOpen] = useState(false)
const [page, setPage] = useState(Constants.Page.Home)
return (
<BrowserRouter>
<div>
<Favicon url={require('../public/favicon.ico')} />
<WebContext.Provider
value={{
isMenuOpen,
setIsMenuOpen,
page,
setPage,
adminCode,
setAdminCode,
}}
>
<Header />
<Switch>
<Route component={MainPage} path="/" exact={true} />
<Route component={PostPage} path="/post/:id" />
<Route component={UserPage} path="/user" />
<Route component={LoginPage} path="/login" />
<Route component={SignupPage} path="/signup" />
<Route component={NewPage} path="/new" />
<Route component={FeedbackPage} path="/feedback" />
<Route component={AdminPage} path="/admin" />
<Route component={SettingPage} path="/setting" />
<Route component={() => <Redirect to="/" />} />
</Switch>
</WebContext.Provider>
</div>
</BrowserRouter>
)
}
export default AppRouter
Most of what I researched on this were old Jest stackoverflows. I am aware there is a jest-worker package but not sure why I would need this or how I would use it when running this simple test.
Here is a link to jest-worker.
Code Trace:
Header component
import { useContext, useState } from 'react'
import { NavLink, useHistory, useLocation } from 'react-router-dom'
import { observer } from 'mobx-react-lite'
import { WebContext } from '../../context/WebContext'
import UnirepContext from '../../context/Unirep'
import UserContext from '../../context/User'
const Header = () => {
const history = useHistory()
const location = useLocation()
const { isMenuOpen, setIsMenuOpen } = useContext(WebContext)
const [searchInput, setSearchInput] = useState<string>('')
const unirepConfig = useContext(UnirepContext)
const userContext = useContext(UserContext)
const gotoNewPage = () => {
if (
userContext.userState &&
userContext.netReputation >= unirepConfig.postReputation
) {
history.push(`/new`, { isConfirmed: true })
}
}
const gotoUserPage = () => {
history.push(`/user`, { isConfirmed: true })
}
const openMenu = () => {
if (!isMenuOpen) {
console.log('open menu!')
setIsMenuOpen(true)
}
}
const handleSearchInput = (event: any) => {
console.log('search input : ' + event.target.value)
}
return (
<header>
<div className="navLinks">
<NavLink to="/" className="link" activeClassName="active" exact>
<img
src={require('../../../public/images/unirep-title.svg')}
/>
</NavLink>
</div>
{/* <div className="search-bar">
<div className="search-icon"><FaSearch /></div>
<form>
<input type="text" name="searchInput" placeholder="Search by keyword, user names or epoch key" onChange={handleSearchInput} />
</form>
</div> */}
{userContext.userState ? (
<div className="navButtons">
<div id="rep" onClick={gotoUserPage}>
<img
src={require('../../../public/images/lighting.svg')}
/>
{userContext.netReputation}
</div>
<div
id="new"
className={
location.pathname === '/new'
? 'navBtn chosen'
: 'navBtn'
}
>
<img
src={require('../../../public/images/newpost.svg')}
onClick={gotoNewPage}
/>
</div>
<div
id="user"
className={
location.pathname === '/user'
? 'navBtn chosen'
: 'navBtn'
}
>
<img
src={require('../../../public/images/user.svg')}
onClick={gotoUserPage}
/>
</div>
<div className="navBtn">
<img
src={require('../../../public/images/menu.svg')}
onClick={openMenu}
/>
</div>
</div>
) : (
<div className="navButtons">
<div
id="login"
className="whiteButton"
onClick={() => history.push('/login')}
>
Sign in
</div>
<div
id="join"
className="blackButton"
onClick={() => history.push('/signup')}
>
Join
</div>
<div id="menu" className="navBtn">
<img
src={require('../../../public/images/menu.svg')}
onClick={openMenu}
/>
</div>
</div>
)}
</header>
)
}
export default observer(Header)
EDIT
The problem may stem from using MobX for state management and not wrapping the component in a Provider but still unsure of how to do this.

Warning: Functions are not valid as a React child. or how to pass the id into element in Route tag

Actually, I am trying to render the DishDetail component, there is an error like "Warning: Functions are not valid as a React child." Therefore, I cannot render the DishDetail Component under "/menu/:dishId".
Anyone can help me? I have tried googling it. The "DishDetailComponent" and "MainComponent" are below respectively. Thanks a lot!
The MainComponent:
import React, { Component, useContext} from 'react';
import Home from './HomeComponent';
import Menu from './MenuComponent';
import Contact from "./ContactComponent";
import DishDetail from './DishdetailComponent';
import Header from './HeaderComponent';
import About from './AboutComponent';
import Footer from './FooterComponent';
import { Routes, Route, Navigate, useParams} from 'react-router-dom';
import {connect} from 'react-redux';
const mapStateToProps = (state) => {
return {
dishes: state.dishes,
comments: state.comments,
leaders: state.leaders,
promotions: state.promotions
}}
class Main extends Component{
constructor(props) {
super(props);}
render() {
const HomePage =() => {
return(
<Home
dish={this.props.dishes.filter((dish) => dish.featured)[0]}
promotion={this.props.promotions.filter((promo) => promo.featured)[0]}
leader={this.props.leaders.filter((leader) => leader.featured)[0]}
/>
);
}
const DishWithId = ({match}) => {
return(
<DishDetail dish={this.props.dishes.filter((dish) => dish.id === parseInt(match.params.dishId, 10))[0]}
comments={this.props.comments.filter((comment) => comment.dishId === parseInt(match.params.dishId, 10))}
/>
);
};
return (
<div>
<Header/>
<Routes>
<Route path ="/home" element={HomePage()} />
<Route exact path="/menu" element={<Menu dishes={this.props.dishes} />} />
<Route path='/menu/:dishId' element={<DishWithId />} />
<Route exact path="/contactus" element={<Contact />} />
<Route exact path="/aboutus" element={<About leaders={this.props.leaders}/>} />
<Route path="*" element={<Navigate replace to="/home" />} />
</Routes>
<Footer />
</div>
);}}
export default connect(mapStateToProps)(Main);
The DishDetailComponent:
import React from 'react';
import { Card, CardImg, CardText, CardBody, CardTitle , Breadcrumb, BreadcrumbItem} from 'reactstrap';
import { Link } from 'react-router-dom';
function RenderDish({dish}) {
console.log('Menu Component render is invoked')
return(
<div className="col-12 col-md-5 m-1">
<Card>
<CardImg width="100%" object src={dish.image} alt={dish.name} />
<CardBody>
<CardTitle>{dish.name}</CardTitle>
<CardText>{dish.description}</CardText>
</CardBody>
</Card>
</div>
);
}
function RenderComments({comments}) {
const comment = comments.map((comment)=> {
return (
<div key={comment.id} className="col-12 col-md-5 m-1">
<p>{comment.comment}</p>
<p>--{comment.author} , {new Intl.DateTimeFormat('en-US', {year: 'numeric', month: 'long', day: '2-digit' }).format(new Date(comment.date))}</p>
</div>
)
});
return(
<div className="col-12 col-md-5 m-1">
<h4>Comment</h4>
{comment}
</div>
);
}
const DishDetail = (props) => {
if (props.dish != null) {
return (
<div className='container'>
<div className='row'>
<Breadcrumb>
<BreadcrumbItem><Link to="/menu">Menu</Link></BreadcrumbItem>
<BreadcrumbItem active>{props.dish.name}</BreadcrumbItem>
</Breadcrumb>
<div className='col-12'>
<h3>{props.dish.name}</h3>
<hr />
</div>
</div>
<div className='row'>
<div className="col-12 col-md-5 m-1">
<RenderDish dish={props.dish} />
</div>
<div className="col-12 col-md-5 m-1">
<RenderComments comments={props.comments} />
</div>
</div>
</div>
);
}
else {
return (
<div></div>
)
}
} export default DishDetail;
HomePage and DishWithId are function components, so this is simply undefined in both cases. Also, you should completely avoid declaring React components within other React components. They should be declared outside on their own. The filtering should occur in the parent component and the filtered result should be passed as a prop to the routed component.
Example:
import React, { Component, useContext } from 'react';
import Home from './HomeComponent';
import Menu from './MenuComponent';
import Contact from "./ContactComponent";
import DishDetail from './DishdetailComponent';
import Header from './HeaderComponent';
import About from './AboutComponent';
import Footer from './FooterComponent';
import { Routes, Route, Navigate, useParams } from 'react-router-dom';
import { connect } from 'react-redux';
const DishWithId = ({ dishes, comments }) => {
const { dishId } = useParams();
return (
<DishDetail
dish={dishes.find((dish) => String(dish.id) === dishId)}
comments={comments.find((comment) => String(comment.dishId) === dishId)}
/>
);
};
class Main extends Component{
constructor(props) {
super(props);
}
render() {
return (
<div>
<Header/>
<Routes>
<Route
path="/"
element={(
<Home
dish={this.props.dishes.find((dish) => dish.featured)}
promotion={this.props.promotions.find((promo) => promo.featured)}
leader={this.props.leaders.find((leader) => leader.featured)}
/>
)}
/>
<Route
path="/menu"
element={<Menu dishes={this.props.dishes} />}
/>
<Route
path='/menu/:dishId'
element={(
<DishWithId
dishes={this.props.dishes}
comments={this.props.comments}
/>
)}
/>
<Route path="/contactus" element={<Contact />} />
<Route path="/aboutus" element={<About leaders={this.props.leaders}/>} />
<Route path="*" element={<Navigate replace to="/home" />} />
</Routes>
<Footer />
</div>
);
}
}
const mapStateToProps = (state) => ({
dishes: state.dishes,
comments: state.comments,
leaders: state.leaders,
promotions: state.promotions
});
export default connect(mapStateToProps)(Main);
It would be better to ditch the connect HOC and use the useSelector hook directly in the components that need to access the state. This avoid the odd props drilling issue.
Example:
Home
import React from 'react';
import { useSelector } from 'react-redux';
const Home = () => {
const dishes = useSelector(state => state.dishes);
const leaders = useSelector(state => state.leaders);
const promotions = useSelector(state => state.promotions);
const dish = dishes.find((dish) => dish.featured);
const promotion = promotions.find((promo) => promo.featured);
const leader = leaders.find((leader) => leader.featured);
return .....;
};
DishDetail
import React from 'react';
import { useParams } from 'react-router-dom';
import { useSelector } from 'react-redux';
const DishDetail = () => {
const { dishId } = useParams();
const dishes = useSelector(state => state.dishes);
const comments = useSelector(state => state.comments);
const dish = dishes.find((dish) => String(dish.id) === dishId);
const comments = comments.find((comment) => String(comment.dishId) === dishId);
return <DishDetail {...{ comments, dish }} />;
};
... etc for other routed components ...
App
import React, { Component, useContext } from 'react';
import Home from './HomeComponent';
import Menu from './MenuComponent';
import Contact from "./ContactComponent";
import DishDetail from './DishdetailComponent';
import Header from './HeaderComponent';
import About from './AboutComponent';
import Footer from './FooterComponent';
import { Routes, Route, Navigate } from 'react-router-dom';
class Main extends Component{
constructor(props) {
super(props);
}
render() {
return (
<div>
<Header/>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/menu" element={<Menu />}/>
<Route path='/menu/:dishId' element={<DishWithId />}/>
<Route path="/contactus" element={<Contact />} />
<Route path="/aboutus" element={<About />} />
<Route path="*" element={<Navigate replace to="/home" />} />
</Routes>
<Footer />
</div>
);
}
}
export default Main;

React fullpageJS and react-router-dom

I am trying to use react fullpageJS and react router dom to create a carousel but it shows empty screen, Here's the code I am using:
APP.JS:
import { Route, Routes } from "react-router-dom";
import Navigation from "./routes/navigation/navigation.component";
import Home from "./components/home/home.component";
function App() {
const About = () => {
return (
<div>
<h1>This is about</h1>
</div>
);
};
return (
<div>
<Routes>
<Route path="/" element={<Navigation />}>
<Route index element={<Home />} />
<Route path="/about" element={<About />} />
</Route>
</Routes>
</div>
);
}
export default App;
Home.jsx:
import { useState, useEffect, React } from "react";
import ProjectPreview from "../project-preview/project-preview.component";
import ReactFullpage from "#fullpage/react-fullpage";
// import "fullpage.js/vendors/scrolloverflow";
import PROJECTS_DATA from "../../Projects";
const Home = () => {
const [projectsToPreview, setProjects] = useState([]);
useEffect(() => {
setProjects(PROJECTS_DATA);
}, []);
<ReactFullpage
render={() => {
return (
<ReactFullpage.Wrapper>
<ReactFullpage.Wrapper>
{projectsToPreview.map((project) => {
return (
<div className="section" key={project.id}>
<h1>Test</h1>
<ProjectPreview project={project} />
</div>
);
})}
</ReactFullpage.Wrapper>
</ReactFullpage.Wrapper>
);
}}
/>;
};
export default Home;
The rendered screen shows only the navbar component but the content in the slider appear neither on the screen nor in the javascript dom
index.js:
import React from "react";
import ReactDOM from "react-dom/client";
import { BrowserRouter } from "react-router-dom";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
);
reportWebVitals();
Navigation.jsx
import { Link, Outlet } from "react-router-dom";
import { Nav, Navbar } from "react-bootstrap";
const Navigation = () => {
return (
<>
<Navbar expand="lg" variant="dark">
<Link className="navbar-brand" to="/">
LOGO
</Link>
<Nav className="ms-auto">
<Link className="nav-link" to="/about">
About
</Link>
</Nav>
</Navbar>
<Outlet />
</>
);
};
export default Navigation;
I suspect the issue is that the Navigation component isn't rendering an Outlet component for the nested routes to render their element into.
Navigation should render an Outlet.
Example:
import { Outlet } from 'react-router-dom';
const Navigation = () => {
...
return (
... nav and layout UI
<Outlet /> // <-- nested routes render content here
...
);
};

React URL Link changes but not rendering

I'm using Link in my <nav> which does change the URL but isn't switching the page component!
Question: Why isn't my page components loading with the URL changes?
File: index.tsx
import { render } from 'react-dom';
import { Provider } from 'react-redux';
import { store } from '#store';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';
import * as serviceWorker from './serviceWorker';
import {
SigninPage,
HomePage,
UserManagementPage,
SiteContentPage,
} from '#pages';
import { ProtectedRoute } from '#components';
import '#styles/main.scss';
import './index.scss';
export function App() {
return (
<Provider store={store}>
<div id='app'>
<Router>
<Switch>
<Route exact path='/signin' component={SigninPage} />
<ProtectedRoute path='/' component={HomePage} />
<ProtectedRoute path='/sitecontent' component={SiteContentPage} />
<ProtectedRoute
path='/usermanagement'
component={UserManagementPage}
/>
</Switch>
</Router>
</div>
</Provider>
);
}
render(<App />, document.getElementById('root'));
serviceWorker.unregister();
File: ProtectedRoute.tsx
import React from 'react';
import { Route, Redirect } from 'react-router-dom';
import { useSelector } from 'react-redux';
import { IAppState } from '#store';
import { ReactComponent as AdaptLogo } from '#assets/images/adaptLogo.svg';
import { NavLink, Link } from 'react-router-dom';
interface IProtectedRoute {
path: string;
component: React.FunctionComponent;
}
export const ProtectedRoute: React.FC<IProtectedRoute> = ({
path,
component: Component,
}) => {
// check if user is authenticated or else route them to the SigninPage
const isUserAuthenticated = useSelector(
(state: IAppState) => state.user.authenticated
);
return (
<>
{isUserAuthenticated ? (
<>
<header>
<AdaptLogo id='adapt-logo' />
</header>
<nav>
<Link to='/'>Home Page</Link>
<Link to='/usermanagement'>User Management Page</Link>
<Link to='/sitecontent'>Site Content Page</Link>
</nav>
<main>
<Route exact path={path} render={(props) => <Component />} />
</main>
</>
) : (
<Redirect to='/signin' />
)}
</>
);
};

Resources