reactjs - 登录/注销按钮重新呈现
问题描述
我正在尝试更改登录/注销按钮的状态而不刷新导航上的页面。我使用 useContext 进行状态管理。我写的代码不断地自动改变按钮的状态。我想知道为什么会这样。
- 上下文 API
export function LoginContextProvider({ children }) {
const [loggedin, setLoggedin] = useState(false);
return (
<LoginContext.Provider value={{ loggedin, setLoggedin }}>
{children}
</LoginContext.Provider>
);
}
- 导航.js
const token = localStorage.getItem('access_token');
const removeToken = () => {
localStorage.removeItem('access_token');
};
const { loggedin, setLoggedin } = useLoginContext();
useEffect(() => {
setLoggedin(!loggedin);
}, [token, loggedin, setLoggedin]);
return (
...
<NavRight>
{loggedin ? (
<NavSigninBtn
onClick={() => {
removeToken();
}}
>
Logout
</NavSigninBtn>
) : (
<NavSigninBtn
onClick={() => {
history.push('/signin');
}}
>
Login
</NavSigninBtn>
)}
</NavRight>
)
解决方案
您在 useEffect 中无限重置登录的值。完全删除您的 useEffect ,而是在您的渲染方法中执行此操作:
<NavRight>
<NavSigninBtn
onClick={() => {
if(!!token){
removeToken();
} else {
history.push('/signin');
}
}}
>
{!!token ? "Logout" : "Login"}
</NavSigninBtn>
</NavRight>
推荐阅读
- matplotlib - 如何在 matplot lib 中设置 y 轴刻度标签
- c# - 使用 GetAll 方法分页的通用存储库以包括项目计数
- android - Apk 在发布模式下崩溃但在调试模式下完美运行
- xamarin.forms - 带有 sql 数据库的移动应用程序
- c++ - 在 C++ 中从函数中保存值的问题
- python - 用于校正输入数据的 Python 模型
- python - 根据相关列表python中的特定条件对概率元素求和
- python-3.x - 为什么在 Tkinter 中尝试更新 Progressbar 的 value 属性时会出现类型错误?
- vhdl - VHDL:无法推断“c [0]”的寄存器,因为它的行为与任何支持的寄存器模型不匹配
- database - 在 MongoDB 中与 $or 或 $and 一起使用时,条件是否必须包装在单独的 {} 中?