我在组件中有一个导航栏(组件navbarUser)App,我想在用户登录时更改导航栏以显示注销和配置文件。当用户登录时,导航栏不会改变,并且我useEffect在App组件和 中有一个NavbarUser,但是如果我手动刷新(F5),那么导航栏会改变。我的代码问题在哪里?为了动态更改导航栏,解决方案是什么?我包括一个视频:视频
谢谢。
组件应用
import React, { useState, useEffect } from "react";
import logo from "./assets/logoBusca.png";
import "./App.css";
import { Route, Switch } from "wouter";
import logic from "./logic";
import Home from "./components/Home";
import Login from "./components/Login";
import Post from "./components/Post";
import NavbarUser from "./components/NavbarUser";
function App() {
const [userLogged, setUserLogged] = useState(false);
useEffect(() => {
(async () => {
const loggedIn = await logic.isUserLoggedIn;
if (loggedIn) setUserLogged(true);
})();
}, [userLogged]);
return (
<div className="App">
<header className="App-header">
<div className="images">
<div className="logo">
<a href="/">
<img src={logo} alt="logo" />
</a>
</div>
<div className="user_flags">
<NavbarUser />
</div>
</div>
</header>
<Switch>
<Route path="/" component={Home} />
<Route path="/login">{() => <Login />}</Route>
<Route path="/nuevabusqueda">{() => <Post />}</Route>
</Switch>
</div>
);
}
export default App;
组件导航用户
import React, { useState, useEffect } from "react";
import userIcon from "../../assets/userIcon.png";
import logic from "../../logic";
export default function NavbarUser() {
const [navbarUserIsLogged, setnavbarUserIsLogged] = useState(false);
useEffect(() => {
(async () => {
const loggedIn = await logic.isUserLoggedIn;
if (loggedIn) setnavbarUserIsLogged(true);
})();
}, [navbarUserIsLogged]);
return (
<>
{!navbarUserIsLogged ? (
<div className="navbar-item has-dropdown is-hoverable">
<img src={userIcon} alt="user" />
<div className="navbar-dropdown">
<a href="/login" className="navbar-item" id="item_login">
Login
</a>
<hr className="navbar-divider" />
<a href="/registro" className="navbar-item" id="item_register">
Registro
</a>
</div>
</div>
) : (
<div className="navbar-item has-dropdown is-hoverable">
<img src={userIcon} alt="user" />
<div className="navbar-dropdown">
<a href="/datos" className="navbar-item" id="item_login">
Perfil
</a>
<hr className="navbar-divider" />
<a href="/user" className="navbar-item" id="item_register">
Logout
</a>
</div>
</div>
)}
</>
);
}
组件登录
import React, { useState } from "react";
import { useLocation } from "wouter";
import logic from "../../logic";
import "./index.css";
export default function Login() {
const [messageError, setMessageError] = useState("");
const [, pushLocation] = useLocation();
async function handleOnSubmit(e) {
e.preventDefault();
const {
email: { value: email },
password: { value: password }
} = e.target;
e.target.reset();
try {
await logic.loginUser(email, password);
pushLocation("/nuevabusqueda");
} catch (error) {
setMessageError(error.message);
}
}
return (
<>
{messageError && (
<div className="message-error">
<p>{messageError}</p>
</div>
)}
<section className="hero is-fullwidth">
<div className="hero-body">
<div className="container">
<div className="columns is-centered">
<div className="column is-4">
<form id="form" onSubmit={e => handleOnSubmit(e)}>
<div className="field">
<p className="control has-icons-left">
<input
className="input"
name="email"
type="email"
placeholder="Email"
required
/>
<span className="icon is-small is-left">
<i className="fas fa-envelope"></i>
</span>
</p>
</div>
<div className="field">
<p className="control has-icons-left">
<input
className="input"
name="password"
type="password"
placeholder="Password"
required
/>
<span className="icon is-small is-left">
<i className="fas fa-lock"></i>
</span>
</p>
</div>
<div className="field">
<p className="control">
<button className="button is-success">Login</button>
</p>
</div>
<div>
<a href="/registro">
¿Aún no estás registrado? Acceso para registarte
</a>
</div>
</form>
</div>
</div>
</div>
</div>
</section>
</>
);
}
逻辑
import buscasosApi from "../data";
const logic = {
set userToken(token) {
sessionStorage.userToken = token;
},
get userToken() {
if (sessionStorage.userToken === null) return null;
if (sessionStorage.userToken === undefined) return undefined;
return sessionStorage.userToken;
},
get isUserLoggedIn() {
return this.userToken;
},
loginUser(email, password) {
return (async () => {
try {
const { token } = await buscasosApi.authenticateUser(email, password);
this.userToken = token;
} catch (error) {
throw new Error(error.message);
}
})();
}
};
export default logic;