Hello Developer, Hope you guys are doing great. Today at Tutorial Guruji Official website, we are sharing the answer of Uncaught Error: Too many re-renders. React limits the number of renders to prevent an infinite loop – ProtectedRoutes Component without wasting too much if your time.
The question is published on by Tutorial Guruji team.
The question is published on by Tutorial Guruji team.
I am attempting to create a ProtectedRoutes component, however, I seem to have created an infinite loop somewhere that I can’t seem to figure out. I’m a beginner.
It should check if there is a cookie stored, and if so, go to the component. If not, it should navigate back to the main page.
ProtectedRoutes.js
import React, { Component, useState } from "react"; import { Route, Navigate } from "react-router-dom"; import Cookies from "universal-cookie"; const cookies = new Cookies(); export default function ProtectedRoutes({component: Component, ...rest}) { const [auth, setAuth] = useState(false); //get cookie from browser if logged in const token = cookies.get("TOKEN"); if (token) { setAuth(true); }; return auth ? <Component /> : <Navigate to="/" /> }
App.js
import { Container, Col, Row } from "react-bootstrap"; import "./App.css"; import Register from "./Register"; import Login from "./Login"; import { Routes, Route } from "react-router-dom"; import Account from "./Account"; import FreeComponent from "./FreeComponent"; import AuthComponent from "./AuthComponent"; import Private from "./ProtectedRoutes"; import ProtectedRoutes from "./ProtectedRoutes"; function App() { return ( <Container> <Row> <Col className="text-center"> <h1 className="header">React Authentication Tutorial</h1> <section id="navigation"> <a href="/">Home</a> <a href="/free">Free Component</a> <a href="/auth">Auth Component</a> </section> </Col> </Row> {/* Routes */ } <Routes> <Route exact path="/" element={ <Account /> } /> <Route exact path="/free" element={ <FreeComponent /> } /> <Route path="/auth" element={<ProtectedRoutes component={AuthComponent} />} /> </Routes> </Container> ); } export default App;
AuthComponent.js
import React from 'react'; export default function AuthComponent() { return ( <div> <h1 className="text-center">Auth Component</h1> </div> ); }
Answer
Yow problem Is heaw.
export default function ProtectedRoutes({component: Component, ...rest}) { const [auth, setAuth] = useState(false); //get cookie from browser if logged in const token = cookies.get("TOKEN"); if (token) { setAuth(true); }; return auth ? <Component /> : <Navigate to="/" /> }
You need yo put setAuth
in a useEffect
export default function ProtectedRoutes({component: Component, ...rest}) { const [auth, setAuth] = useState(false); React.useEffect(()=>{ const token = cookies.get("TOKEN"); if (token) { setAuth(true); } },[auth]); return auth ? <Component /> : <Navigate to="/" /> }
We are here to answer your question about Uncaught Error: Too many re-renders. React limits the number of renders to prevent an infinite loop – ProtectedRoutes Component - If you find the proper solution, please don't forgot to share this with your team members.