javascript - react 。尝试从 onClick 事件调用自定义 Hook

标签 javascript reactjs

我正在尝试制作一个按钮来注销用户并将逻辑移动到自定义 Hook useLogout.js

菜单.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();
};

当我运行它并单击按钮时,我收到此错误:无效的 Hook 调用。钩子(Hook)只能在函数组件体内调用 错误:导出默认函数 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.js 中的 useLogout 函数?

最佳答案

你想要的可能是这样的:

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

关于javascript - react 。尝试从 onClick 事件调用自定义 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58289135/

相关文章:

javascript - 在 Jest 中用测试覆盖抽象类方法

html - 非常奇怪的 CSS 格式与 React 应用程序,主要重叠。我该如何解决?

reactjs - React linter airbnb proptypes 数组

javascript - 在 JavaScript 中使用哪种方式来定义类

javascript - 如何检查选项卡加载失败

reactjs - 如何在 React Js 中有条件地隐藏和显示输入

reactjs - Passport JS 与 Firebase 身份验证系统

javascript - 带条件的 jsx 样式

javascript - 在用于 html 控件的 javascript 中选择索引更改事件

javascript - 在 decodeAudioData 回调方法中存储缓冲区