所以这里我有通过本地存储令牌的登录功能。我在开发工具/应用程序中创建用户时获得令牌,它将我重定向到正在工作的家庭。不起作用的是这个。创建一个用户,它正在工作,但当它加载时,它应该显示logout而不是login,并且应该隐藏购物车组件。我在哪里犯了一个错误上下文Api
import React from "react";
const UserContext = React.createContext();
function getUserFromLocalStorage() {
return localStorage.getItem("authToken")
? JSON.parse(localStorage.getItem("authToken"))
: { username: null, token: null };
}
function UserProvider({ children }) {
const [user, setUser] = React.useState(getUserFromLocalStorage());
const history = useHistory();
const logoutHandler = () =>{
localStorage.removeItem("user");
history.push("/")
}
return (
<UserContext.Provider
value={{ user, logoutHandler }}
>
{children}
</UserContext.Provider>
);
}
export { UserContext, UserProvider };
登录链接
import React from "react";
import { Link } from "react-router-dom";
import { UserContext } from "../../context/user";
import { useHistory } from "react-router-dom"
export default function LoginLink() {
const { user, logoutHandler } = React.useContext(UserContext);
if (user.authToken) {
return (
<button
onClick={() => {
logoutHandler();
}}
className="login-btn"
>
logout
</button>
);
}
return <Link to="/login">login</Link>;
}
标题
import React from 'react';
import { Link, useHistory } from "react-router-dom";
import Search from './Search';
import './Header.css'
import SearchBooks from './SearchBooks';
import LoginLink from '../Signin/LoginLink';
import CartLink from '../Cart/CartLink';
import { UserContext } from '../../context/user';
const Header = () => {
const { user } = React.useContext(UserContext);
return (
<div className='header__container'>
<Link to='/'>
<img src='/audi.png' />
</Link>
<li>
<LoginLink />
</li>
{user.authToken &&(
<CartLink />
)
}
</div>
)
}
export default Header
登录组件
import { useState, } from "react";
import { useHistory } from "react-router-dom"
import axios from "axios";
import { Link } from "react-router-dom";
import "./Signin.css";
const Login = () => {
const { user, setUser } = React.useContext(UserContext);
const [email, setEmail] = useState("");
const [password, setPassword] = useState("");
const [error, setError] = useState("");
const history = useHistory()
const loginHandler = async (e) => {
e.preventDefault();
const config = {
header: {
"Content-Type": "application/json",
},
};
try {
const { data } = await axios.post(
"http://localhost:5000/api/auth/login",
{ email, password },
config
);
localStorage.setItem("authToken", data.token);
setUser(user)
history.push("/");
} catch (error) {
if (error.response) {
setError(error.response.data.error);
}
setTimeout(() => {
setError("");
}, 5000);
}
};
return (
<div className="login-screen">
<form onSubmit={loginHandler} className="login-screen__form">
<h3 className="login-screen__title">Login</h3>
{error && <span className="error-message">{error}</span>}
<div className="form-group">
<label htmlFor="email">Email:</label>
<input
type="email"
required
id="email"
placeholder="Email address"
onChange={(e) => setEmail(e.target.value)}
value={email}
tabIndex={1}
/>
</div>
<div className="form-group">
<label htmlFor="password">
Password:{" "}
<Link to="/forgotpassword" className="login-screen__forgotpassword">
Forgot Password?
</Link>
</label>
<input
type="password"
required
id="password"
autoComplete="true"
placeholder="Enter password"
onChange={(e) => setPassword(e.target.value)}
value={password}
tabIndex={2}
/>
</div>
<button type="submit" className="btn btn-primary">
Login
</button>
<span className="login-screen__subtext">
Don't have an account? <Link to="/register">Register</Link>
</span>
</form>
</div>
);
};
export default Login;
登录后,只将authToken设置到localStorage中,而不是设置到提供程序中。您需要在登录后调用setUser,以便Header组件知道user已登录。
localStorage 本地存储 存储针对QQ帐号隔离 数据存储于本地文件中。游戏结束后不会被删除 函数 key( index) 获取对应索引的key 手q 版本7.8.5 参数 参数名 类型 说明 index number 索引值 返回值 类型 说明 string 说明 示例 var stringKey = BK.localStorage.key(0); getItem( key) 获取ke
本地存储提供了localstore和sessionstore两个类。localstore使用本地文件持久化数据,因此该类存储的数据不会失效。sessionstore存储的数据会在插件运行结束时清空,因此有效期为插件运行期。localstore和sessionstore的API接口一致。 set QN.localstore.set({ query: { key: 'name'
问题内容: 除了是非持久性的并且仅限于当前窗口之外,会话存储与本地存储相比是否还有其他好处(性能,数据访问等)? 问题答案: localStorage和sessionStorage都扩展了Storage。除了的预期的“非持久性”外,它们之间没有区别。 也就是说,存储在中的数据将 一直保留到明确删除为止 。所做的更改将被保存,并且可用于当前和将来对该站点的所有访问。 对于, 更改仅在每个选项卡上可用
问题内容: 我想通过将所有Cookie移到本地存储中来减少其加载时间,因为它们似乎具有相同的功能。除了明显的兼容性问题以外,使用本地存储替换cookie功能是否有任何利弊(尤其是性能方面的优势)? 问题答案: Cookies和本地存储有不同的用途。Cookies主要用于读取 服务器端 ,本地存储只能由 客户端 读取。所以问题是,在您的应用程序中,谁需要此数据-客户端还是服务器? 如果它是您的客户端
BaaS 提供本地存储功能,皆为同步方法。 保存数据 wx.BaaS.storage.set(key, value) 如果 storage 里面 key 值对应的 value 已经存在,执行此函数会覆盖掉原来该 key 对应的 value。 参数说明 参数 类型 必填 说明 key String 是 本地存储中指定的 key 值 value Object/String 是 需要存储的内容 示例代码
我的登录页面http://localhost:8080/nradmin/welcome,主页(登录成功后)http://localhost:8080/nradmin/home 我想注销,不再能够访问任何其他页面,如主页,但只能访问欢迎(登录)页面。如果我键入http://localhost:8080/nradmin/home在注销后的浏览器上,我可以继续访问主页,而无需登录。 我已经实现了从抽象类