代码之家  ›  专栏  ›  技术社区  ›  klabak

反应上下文-从函数中分派

  •  1
  • klabak  · 技术社区  · 2 年前

    我必须在函数中调用dispatch(上下文,而不是Redux),但我不能这样做。( Error: Invalid hook call. Hooks can only be called inside of the body of a function component. )

    有没有办法运行钩子(或者只运行钩子) dispatch )在从组件调用的函数中? 我可以用Redux做这个( store.dispatch(...) ),但我不知道如何使用React上下文进行此操作。

    示例功能:

    function someAction() {
      const { dispatch } = React.useContext(SomeContext);
      dispatch({
        type: "ACTION_NAME",
      });
    }
    

    我试图直接从组件调用该函数:

    <button onClick={() => someAction()}>Click me</button>
    

    当然,我可以通过 派遣 ,但我想避免这种情况,因为函数将被共享,而且应该很简单。

    <button onClick={() => someAction(dispatch)}>Click me</button>
    
    1 回复  |  直到 2 年前
        1
  •  3
  •   Ori Drori    2 年前

    只能在组件或其他挂钩中使用挂钩,但可以在其他函数中使用挂钩的返回值。提取 useContext 并使用返回的 dispatch :

    const Component = () => {
      const { dispatch } = React.useContext(SomeContext);
    
      function someAction() {
        dispatch({
          type: "ACTION_NAME",
        });
      }
    
      return (
        <button onClick={someAction}>Click me</button>
      );
    };
    

    我将创建一个自定义钩子,返回动作函数,并在组件中使用它,以使其不那么笨重,更易于重用:

    const useAction = () => {
      const { dispatch } = React.useContext(SomeContext);
      
      return () => dispatch({
        type: "ACTION_NAME",
      });
    };
    

    用法:

    const Component = () => {
      const someAction = useAction();
      
      return (
        <button onClick={someAction}>Click me</button>
      );
    };