如何在自定义挂钩上使用 useCallback?

Posted

技术标签:

【中文标题】如何在自定义挂钩上使用 useCallback?【英文标题】:How to use useCallback on a custom hook? 【发布时间】:2020-08-18 03:09:44 【问题描述】:

我需要这个:const setError = useError(); 作为 useEffect 中的依赖项,但由于此函数也用于其他地方(在同一组件内),所以每当抛出错误时,我的 useEffect api 重新获取数据.

我应该禁用react-hooks/exhaustive-deps 规则还是有办法解决这个问题?如果我尝试将它包装在 useCallback 中,我会收到一个错误,即 hooks 只能在组件本身中使用。

编辑

export const useError = (): ((error: any, title?: string) => void) => 
  const dispatch = useDispatch();
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  const setError = (error: any, title = 'Error'): void => 
    Sentry.captureException(error);
    const bodyText = error.message || error;
    const errorTitle = error.name || title;
    dispatch(
      setNotification(
        type: notificationTypes.prompt,
        title: errorTitle,
        bodyText,
        className: 'error',
        show: true,
      )
    );
  ;

  return setError;
;

【问题讨论】:

能否展示useError的实现 @ShubhamKhatri 编辑了我的问题 【参考方案1】:

您可以在返回之前将带有useCallback with an empty dependencysetError 函数包装在您的自定义钩子中,以便它只被创建一次

export const useError = (): ((error: any, title?: string) => void) => 
  const dispatch = useDispatch();
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
  const setError = useCallback((error: any, title = 'Error'): void => 
    Sentry.captureException(error);
    const bodyText = error.message || error;
    const errorTitle = error.name || title;
    dispatch(
      setNotification(
        type: notificationTypes.prompt,
        title: errorTitle,
        bodyText,
        className: 'error',
        show: true,
      )
    );
  , []);

  return setError;
;

通过上述操作,您可能会收到 ESLint 警告,将 dispatch 和 Sentry 作为依赖项添加到 useCallback 依赖项数组中,您可以将它们添加到依赖项数组中,因为 disptachSentry 都不会改变

【讨论】:

以上是关于如何在自定义挂钩上使用 useCallback?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Mock Service Worker 在自定义钩子中模拟获取?

在自定义反应钩子中使用 axios

用于电容器存储的定制挂钩

Gitlab:服务器挂钩自定义错误消息未显示在合并请求上

如何在自定义 woocommerce 结帐字段中显示 $_SESSION 变量?

尝试在自定义侧边栏上显示用户名,它给了我下面的错误消息