反应。试图从onClick事件中调用自定义钩子

时间:2019-10-08 15:05:31

标签: javascript reactjs

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

1 个答案:

答案 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>;