instead of type everything manually ,I just want to render my routes as an array.
export const routes = [ { path: "/", component: Home, layout: NonAuthLayout, }, { path: "/about", component: About, layout: NonAuthLayout, }, ];
and in my app.js file, I did something like this:
<BrowserRouter> <Routes> {routes.map((route, index) => { const Component = route.component; const Layout = route.layout || Fragment; return ( <Route key={index} path={route.path} element={ <Layout> <Component /> </Layout> } /> ); })} </Routes> </BrowserRouter>
But its giving error , while I tried to execute it.
Warning: Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it. at Routes (http://localhost:3000/static/js/bundle.js:57985:5) at InnerThemeProvider (http://localhost:3000/static/js/bundle.js:12771:70) at ThemeProvider (http://localhost:3000/static/js/bundle.js:12462:5) at ThemeProvider (http://localhost:3000/static/js/bundle.js:12791:5) at Router (http://localhost:3000/static/js/bundle.js:57918:15) at BrowserRouter (http://localhost:3000/static/js/bundle.js:56727:5) at App at SettingProvider (http://localhost:3000/static/js/bundle.js:174:5)
but but, If I put like this it works:
<Route path=”/” element={} />
update- non-auth layout piucture
I think , I did some silly mistake. can someone correct me here?
Advertisement
Answer
I don’t see any overt issue with your code, and it in fact appears to run without issue.
I suspect you may have a component export/import issue with one or more of the Home
, About
, and NonAuthLayout
components, so double check these.
But, there’s a simpler way
Don’t re-invent the wheel. react-router-dom
exports a useRoutes
hook that effectively does this.
Reconfigure your routes config to comply with the RRD syntax:
export const routes = [ { element: <NonAuthLayout />, children: [ { path: "/", element: <Home />, }, { path: "/about", element: <About />, }, ], }, ];
NonAuthLayout
NonAuthLayout
is now a layout route and needs to render an Outlet
instead of a children
prop.
import { Outlet } from 'react-router-dom'; const NonAuthLayout = () => ( <Box> <div> <TopBar /> </div> <Box> <Outlet /> </Box> </Box> );
App
import { BrowserRouter, useRoutes } from 'react-router-dom'; import { routes } from '../path/to/routes'; ... const element = useRoutes(routes); ... <BrowserRouter> {element} </BrowserRouter>