im试图创建一个按钮以注销用户并将逻辑移动到自定义钩子useLogout.js
。
Menu.js
import useLogout from './useLogout';
import UserContext from './UserContext';
import TokenContext from './TokenContext';
function Menu() {
const [user, setUser] = useContext(UserContext);
const [token, setToken] = useContext(TokenContext);
/* some code....*/
let button;
if (token && token.access_token && user) {
button = <Button onClick={useLogout}>Logout</Button>;
} else {
button = <Button>Login</Button>;
}
/* some code.... */
return(
<Nav.Link>
{button}
</Nav.Link>
)
}
useLogout.js
import React, { useContext, useState} from 'react';
import UserContext from './UserContext';
import TokenContext from './TokenContext';
export default function useLogout() {
const [user, setUser] = useContext(UserContext);
const [token, setToken] = useContext(TokenContext);
localStorage.removeItem("token");
localStorage.removeItem("user");
setToken();
setUser();
};
当我运行它并单击按钮时,出现以下错误:无效的挂接调用。挂钩只能在功能组件的主体内部调用
错误:export default function useLogout() {
const [user, setUser] = useContext(UserContext);
所以我坚称我对函数useLogout的调用是错误的,所以我修改了代码,调用了onClick={useLogout()}
而不是onClick={useLogout}
所以这行看起来像这样:
button = <Button onClick={useLogout()}>Logout</Button>;
但是然后我得到这个错误:有条件地调用React Hook“ useLogout”。在每个组件渲染中必须以完全相同的顺序调用React Hooks
即使我尝试过:
button = <Button onClick={() => useLogout}>Logout</Button>;
如何修改代码,以便当我单击按钮时执行useLogout
中的功能useLogout.js
?
答案 0 :(得分:2)
您想要的可能是这样的:
export default function useLogout() {
const [user, setUser] = useContext(UserContext);
const [token, setToken] = useContext(TokenContext);
return () => {
localStorage.removeItem("token");
localStorage.removeItem("user");
setToken();
setUser();
}
};
/
const logoutCb = useLogout();
button = <Button onClick={logoutCb}>Logout</Button>;