【发布时间】:2020-09-27 16:08:27
【问题描述】:
我有一个身份验证服务,可以在成功登录后设置本地存储令牌
身份验证服务:
async function login(email, password, remember) {
const data = await ApiClient.post(`/api/auth`, {
email: email, password: password, remember: remember
});
localStorage.setItem('token', data.token);
return data.token;
}
async function logout() {
localStorage.removeItem('token');
}
export const authenticationService = {
login,
logout,
get currentUserValue () { return localStorage.getItem('token') }
}
App.js
{ authenticationService.currentUserValue &&
<Menu>Logged In</Menu> }
<Switch>
<PrivateRoute path="/dashboard" component={Dashboard} />
<Route path="/login" component={Login} />
<Route component={Error404} />
</Switch>
Login.js
async function login(e) {
e.preventDefault();
try {
const token = await authenticationService.login(email, password, remember);
setErrorMsg('');
history.push('/dashboard');
} catch (err) {
if(err.response.status === 401) {
setErrorMsg('Unauthorized access, please login again.');
}
}
}
<form className={classes.form} noValidate onSubmit={login}>
<TextField value={email} />
<TextField value={password} />
<FormControlLabel
control={<Checkbox value="remember" color="primary" />}
label="Remember me"
onChange={(e) => setRemember(e.target.value)}
value={remember}
/>
<Button type="submit">Sign In</Button>
</form>
当我使用Login.js 中的表单登录时,它不会从App.js 呈现菜单<Menu>Logged In</Menu>。当我们在 localstorage get currentUserValue () { return localStorage.getItem('token') } 中设置令牌值并在登录后渲染菜单时,有没有办法重新渲染?
【问题讨论】:
-
我建议在您的商店/状态中的某处反映该值,您可以使用
useEffect挂钩或使用storage event 上的侦听器来设置它。在 React 中很难跟踪存储在 React 组件之外的数据,因为它不会被监视以触发重新渲染。
标签: javascript reactjs react-router react-router-dom react-router-v4