Reputation: 61
I have a Form with 3 states. should I put those states in App.js
? because I'm using separate and custom component for my router called Router.js
.
this is my App.js
and as you can see I don't have any Form component because it is on Home.js
.
if I put my states to App.js
How can I pass them to child component?
so Router.js
for states or App.js
?
App.js
import { CssBaseline } from "@mui/material";
import "./App.css";
import Navbar from "./views/components/Navbar/Navbar";
import Router from "./routes/Router";
function App() {
return (
<div className="main">
<CssBaseline />
<Navbar />
<Router />
</div>
);
}
export default App;
Router.js
import React from "react";
import { Route, Routes } from "react-router-dom";
import Home from "../views/pages/Home";
import Login from "../views/pages/Login";
const Router = () => {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="/Home" element={<Home />} />
<Route path="/Login" element={<Login />} />
</Routes>
);
};
export default Router;
Upvotes: 1
Views: 910
Reputation: 1001
If you want to just use that data you can use Context
But if you want to change data everywhere it's better to use state managers like Redux
function App() {
const [mainState,setMainstate]=useState({baseline:{},navbar:{},router:{home:{}}});
return (
<div className="main">
<CssBaseline state={mainState} setState={setMainstate}/>
<Navbar state={mainState} setState={setMainstate} />
<Router state={mainState} setState={setMainstate} />
</div>
);
}
for instance in <Router/>
const Router = ({state,setState}) => {
const sampleChangeState=()=>{
setState({...state,router:{...state.router,home:{color:red}}})
}
return (
<Routes>
<Route path="/" element={<Home state={state.router.home}
setState={setState}
/>} />
<Route path="/Home" element={<Home />} />
<Route path="/Login" element={<Login state={state.router.login} />} />
</Routes>
);
};
Upvotes: 3
Reputation: 179
Passing states from app.js to home component(as props).
import React from "react"
import { CssBaseline } from "@mui/material";
import "./App.css";
import Navbar from "./views/components/Navbar/Navbar";
import Router from "./routes/Router";
function App() {
const [formStates,setFormStates] = React.useState({
stateOne : "",
stateTwo : "",
stateThree : "",
});
return (
<div className="main">
<CssBaseline />
<Navbar />
<Router formStates={formStates} setFormStates={setFormStates}/>
</div>
);
}
export default App;
And In the Router.js
import React from "react";
import { Route, Routes } from "react-router-dom";
import Home from "../views/pages/Home";
import Login from "../views/pages/Login";
const Router = ({formStates,setFormStates}) => {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="/Home" element={<Home formStates={formStates} setFormStates=
{setFormStates} />} />
<Route path="/Login" element={<Login />} />
</Routes>
);
};
export default Router;
Upvotes: 0
Reputation: 97
I think you should handle separated states for the components.
You can have a callback from login to Router if you want to redirect the user after successful auth.
Upvotes: 0