'Login and Logout is not toggling in header of react js
I am new to react, I have tried some basic react js login and logout page in react js. Login is working fine but after login I can't able to toggle the login to logout in the header. I also tried to use context to declare the global state but even though state is changing from 0 to 1 after that login header is not toggling to logout in header. Please help me to toggle from login to logout after successful login. I have also attached my code.
App.js
import React, { useState } from 'react';
import './App.css';
import 'bootstrap/dist/css/bootstrap.min.css';
import Header from './components/Header';
import AppContext from './components/AppContext';
function App() {
const [LoggedIn, setLoggedIn] = useState(0);
const globalState = {
Logged: LoggedIn,
};
return (
<div className="App">
<AppContext.Provider value={globalState}>
<Header />
</AppContext.Provider>
</div>
);
}
export default App;
Header.js
import React, { useState, useContext } from 'react';
import AppContext from './AppContext';
import { Link, BrowserRouter, Routes, Route } from 'react-router-dom';
import Home from './Home';
import About from './About';
import Login from './Login';
import UserPage from './UserPage';
function Header(props) {
const Logg = useContext(AppContext);
return (
<div>
<BrowserRouter>
{Logg.Logged ?
<>
<Link to="/" style={{ paddingRight: '60px', paddingLeft: '950px' }}>Home</Link>
<Link to="/about" style={{ paddingRight: '60px' }}>About</Link>
<Link to="/" style={{ paddingRight: '60px' }}>Log out</Link>
</>
:
<>
<Link to="/" style={{ paddingRight: '60px', paddingLeft: '950px' }}>Home</Link>
<Link to="/about" style={{ paddingRight: '60px' }}>About</Link>
<Link to="/login" style={{ paddingRight: '60px' }}>Login</Link>
</>
}
<Routes>
<Route path='/' element={<Home />} />
<Route path='/login' element={<Login />} />
<Route path='/about' element={<About />} />
<Route path='/userprofile' element={<UserPage />} />
</Routes>
</BrowserRouter>
</div>
)
};
export default Header;
Login.js
import React, { useState, useContext } from 'react';
import { useNavigate } from 'react-router-dom';
import '../App.css'
import Header from './Header';
import UserPage from './UserPage';
import AppContext from './AppContext';
function Login(props) {
let navi = useNavigate();
const [name, setName] = useState();
const [password, setPassword] = useState();
const [message, setMessage] = useState();
const Logg = useContext(AppContext);
const database = [
{
name: "piranesh",
password: "12"
}
];
function handleSubmit(event) {
event.preventDefault();
const userData = database.find((n) => n.name === name);
if (userData) {
if (userData.password === password) {
Logg.Logged = 1;
navi('/userprofile');
}
else {
setMessage("Invalid username or Password");
}
}
else {
setMessage("Invalid username or Password");
}
setName("");
setPassword("");
}
return (
<div style={{ paddingTop: "150px" }}>
<h4>Login</h4>
<form onSubmit={handleSubmit}>
<h3>{message}</h3>
<table className="center">
<tr>
<th><label >User Name : </label></th>
<th><input type="text" name="name" value={name} placeholder="Enter your user name" onChange={(event) => setName(event.target.value)} /><br /></th>
</tr>
<tr>
<th><label >Password : </label></th>
<th><input type="password" name="password" value={password} placeholder="Enter your password" onChange={(event) => setPassword(event.target.value)} /><br /></th>
</tr>
<tr>
<th><button type="submit">Log in</button></th>
</tr>
</table>
</form>
</div>
);
}
export default Login;
UserPage.js
import React from 'react';
function UserPage(props) {
return (
<div>
<h1>Hello this is User Page </h1>
</div>
)
};
export default UserPage;
Thanks.
Solution 1:[1]
You have to change the LoggedIn state in App.JS while user logged in. Now your changing the global reference it not re-render the component. That's why the header is not toggling.
App.js
function App() {
const [LoggedIn, setLoggedIn] = useState(0);
return (
<div className="App">
<AppContext.Provider value={{Logged:LoggedIn,HandleLoggedIn:(val)=>setLoggedIn(val)}}>
<Header />
</AppContext.Provider>
</div>
);
}
Login.js
function handleSubmit(event) {
event.preventDefault();
const userData = database.find((n) => n.name === name);
if (userData) {
if (userData.password === password) {
Logg.HandleLoggedIn(1)
navi('/userprofile');
}
else {
setMessage("Invalid username or Password");
}
}
else {
setMessage("Invalid username or Password");
}
setName("");
setPassword("");
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Arun Dinesh |
