【问题标题】:How to return a request function from useQuery in react-query如何在 react-query 中从 useQuery 返回请求函数
【发布时间】:2021-12-08 07:15:22
【问题描述】:

我有一个 React 钩子,它返回一个调用 API 的请求函数

代码如下:

export const useGetFakeData = () => {
  const returnFakeData = () =>
    fetch('https://fake-domain.com').then(data => console.log('Data arrived: ', data))

  return returnFakeData
}

然后我在类似这样的组件中使用这个钩子

const getFakeData = useGetFakeData()

useEffect(() => getFakeData(), [getFakeData])

当我们需要从自定义钩子返回请求函数时,如何在 react-query 中实现这个效果?

感谢您的建议!

【问题讨论】:

    标签: reactjs react-query


    【解决方案1】:

    在文档中挖掘,我发现 useQuery 钩子中的 React-Query 提供了一个 refetch() 函数。

    在我的例子中,我只是将属性 enabled 设置为 false(只是为了不自动调用 mount 时的函数),然后返回一个这样的请求函数

    export const useGetFakeData = () => {
      const { refetch } = useQuery<void, Error, any>({
        queryFn: () =>
          fetch('https://fake-domain.com').then(data => console.log('Data arrived: ', data)),
        queryKey: 'fake-data',
        enabled: false,
      })
    
      return refetch
    }
    

    【讨论】:

      【解决方案2】:

      我认为您只是在寻找标准的 react-query 行为,即在组件安装时触发请求(除非您禁用查询)。在您的示例中,这只是:

      export const useGetFakeData = () =>
        useQuery('fakeData', () => fetch('https://fake-domain.com'))
      }
      
      
      const { data } = useGetFakeData()
      
      

      请注意,这只是一个简单的示例:

      【讨论】:

        【解决方案3】:

        如果你想使用命令式的方式请求数据,你可以使用useMutation钩子。从钩子返回的data 是突变调用的最新解析值:

        const [mutate, { data, error }] = useMutation(handlefunction);
        
        useEffect(() => {
          mutate(...);
        }, []);
        

        【讨论】:

        • 你认为这真的是突变吗?我在想变异是一个改变某些东西的过程,例如通过 POST 方法的注册过程,而不是 GET 请求
        • @BorisLebedev useMutation 适用于发布/放置/删除操作,因为以命令式方式执行它们是很自然的(当您单击删除按钮时,您 订购变异函数来做某事)。 useQuery 适用于获取数据,因为它是在 react 中使用的声明性方式 - 当组件安装时,您声明数据的 props 和形状以及数据应如何在组件内显示。这并不意味着你被禁止使用useMutation 来获取数据,这不是一种传统的方式,...
        • @BorisLebedev 并且由于您的问题要求一种以命令式方式请求数据的方法,因此您可以使用此useMutation 方法。查看命令式/声明式 here 之间的区别
        猜你喜欢
        • 1970-01-01
        • 2021-04-04
        • 2021-10-10
        • 2022-01-04
        • 2021-10-14
        • 1970-01-01
        • 2023-01-24
        • 2021-06-28
        • 1970-01-01
        相关资源
        最近更新 更多