【问题标题】:react-query with rules of hook broken error带有钩子损坏错误规则的反应查询
【发布时间】:2021-10-16 15:40:44
【问题描述】:

我正在尝试使用 react-query 将我的 API 调用提取到可重用的挂钩中。我需要发送到这个钩子的参数是 moduleName 和 value。出于某种原因,我收到一个错误,我需要遵循 hooks 规则。

请指教。

这是我的代码:

export const useAutoSave = () => {
  const fetcher = useCallback(
    (
      moduleName: ISourceLoaderEditTabs,
      value: Partial<ISourceConfigurationEdit[ISourceLoaderEditTabs]>,
      saveUrl = '',
    ) => {
      const handleSaveSourceDetailsMutation = useMutation(
        (data: ISourceConfigurationEdit) =>
          saveUrl
            ? postSaveStageRaw(`${POST_SAVE_STAGE_RAW}?${saveUrl}`, data)
            : saveSourceDetails(data),
      );
      const sourceId = sessionStorage.getItem('sourceId');

      const sourceDetail = queryClient.getQueryData([
        'getSourcesDetail',
        Number(sourceId),
      ]);
      handleSaveSourceDetailsMutation.mutate(
        {
          ...(sourceDetail as ISourceConfigurationEdit),
          [moduleName]: {
            ...(sourceDetail as ISourceConfigurationEdit)[moduleName],
            ...value,
          },
        },
        {
          onSuccess: async (data) => {
            queryClient.setQueryData(
              ['getSourcesDetail', Number(sourceId)],
              data,
            );
          },
        },
      );
    },
    [],
  );

  return [fetcher];
};

然后在我的组件中我将它用作

const [fetch] = useAutoSave();

fetch('abc', {
  name:'a2441918'
})

代码 sn-p : Stackblitz: https://stackblitz.com/edit/react-q8uvse?file=src%2Fhooks.js

【问题讨论】:

    标签: reactjs react-hooks react-query


    【解决方案1】:

    您不能在useCallback 中调用useMutation。另外,你不需要。 useMutation 返回一个具有两个函数的对象 - mutatemutateAsync,当你想调用你的突变时,你可以调用它们。因此,您的自定义钩子很可能只返回 useMutation 返回的任何内容。 useMutation 的第一个参数是 mutateFn - 当您调用 mutatemutateAsync 时调用的函数,您也可以在那里传递一个参数对象:

    const useAutoSave = () => {
      return useMutation(
       ({ moduleName, value, saveUrl }) => saveUrl
            ? postSaveStageRaw(`${POST_SAVE_STAGE_RAW}?${saveUrl}`, data)
            : saveSourceDetails(data),
      )
    }
    

    然后您可以通过以下方式调用它:

    const { mutate } = useAutoSave()
    
    <button onClick={() => {
      mutate({ moduleName: 'something, value: 'somethingElse' })
    }}>Save</button>
    

    【讨论】:

      【解决方案2】:

      错误日志中指出的问题 - useMutation 的使用

      const handleSaveSourceDetailsMutation = useMutation(
              (data: ISourceConfigurationEdit) =>
                saveUrl
                  ? postSaveStageRaw(`${POST_SAVE_STAGE_RAW}?${saveUrl}`, data)
                  : saveSourceDetails(data),
            );
      

      这个useMutation 钩子需要在useCallback 之外。这也意味着saveUrl 和其他参数需要重构。

      export const useAutoSave = () => {
        const i_dont_know = useMutation(x,x,x,x); // hooks can't be called in regular functions 
      }
      

      钩子规则供参考:https://reactjs.org/docs/hooks-rules.html

      【讨论】:

      • 也试过了。同样的错误
      • 你可能还需要为 useMutation hook 发布几行代码。错误状态@第 10 行。
      • UseMutation 来自“react-query”
      • 注明。那时不确定。肯定你打破了发布代码中的钩子规则,如果你按照我的建议更正了那个,至少这个错误应该已经修复了。
      • stackblitz.com/edit/react-q8uvse?file=src%2Fhooks.js 这是我的 stackblitz 与您推荐的更改
      猜你喜欢
      • 2016-04-08
      • 2020-12-18
      • 2020-11-11
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      相关资源
      最近更新 更多