React-Query:单击按钮时如何使用Query

Lee*_*fin 43 react-native react-query

我是这个反应查询的新手库的。

我知道当我想获取数据时,使用这个库我可以做这样的事情:

const fetchData = async()=>{...}

// it starts fetching data from backend with this line of code
const {status, data, error} = useQuery(myKey, fetchData());
Run Code Online (Sandbox Code Playgroud)

有用。但是如何仅在单击按钮时触发数据获取?,我知道我可能可以做类似的事情<Button onPress={() => {useQuery(myKey, fetchData())}}/>,但是如何管理返回的数据和状态...

Nic*_*via 51

根据API Reference,您需要将该enabled选项更改为false以禁用查询自动运行。然后你手动重新获取。

// emulates axios/fetch since useQuery expectes a Promise
const emulateFetch = async _ => {
  return new Promise(resolve => {
    resolve([{ data: "ok" }]);
  });
};

const handleClick = () => {
  // manually refetch
  refetch();
};

const { data, refetch } = useQuery("key", emulateFetch, {
  refetchOnWindowFocus: false,
  enabled: false // turned off by default, manual refetch is needed
});

return (
  <div>
    <button onClick={handleClick}>Click me</button>
    {JSON.stringify(data)}
  </div>
);
Run Code Online (Sandbox Code Playgroud)

在这里工作沙箱。
 

奖励:您可以将任何返回布尔值的内容传递给enabled. 这样你就可以创建Dependant/Serial 查询

// Get the user
const { data: user } = useQuery(['user', email], getUserByEmail)
 
// Then get the user's projects
const { isIdle, data: projects } = useQuery(
  ['projects', user.id],
  getProjectsByUser,
  {
    // `user` would be `null` at first (falsy),
    // so the query will not execute until the user exists
    enabled: user,
  }
)
Run Code Online (Sandbox Code Playgroud)

  • 我们不能将突变用于 get 调用,我们可以将它们用于 put/post/delete 调用 https://react-query.tanstack.com/guides/mutations (11认同)
  • 如果它对某人有帮助,“refetch()”会返回一个承诺,并且如果您想同步执行某些操作,则可以解析它以获取响应的数据。 (5认同)
  • 为什么不使用 useMutation 而是使用 useQuery ? (4认同)
  • @ADB我在文档中找不到任何“useMutation 不能与 get 请求一起使用”的内容,你能指出我正确的位置吗? (3认同)
  • 这可行,但[主要维护者不推荐](https://github.com/TanStack/query/discussions/5820#discussioncomment-6604337)。而是使用“queryClient.fetchQuery()” (3认同)
  • 我不想发表评论,因为评论列表足够大,但来自 Tanner:“区别在于数据的流动。useQuery 用于查询异步数据,useMutation 用于变异它。或者用传统的 CRUD 讲:阅读:useQuery 创建/更新/删除:useMutation”。 (2认同)

小智 28

您必须传递manual: true参数选项,以便查询不会在挂载时获取。另外,您应该fetchData在不带括号的情况下传递,因此您传递的是函数引用而不是值。要调用查询,请使用 refetch()。

const {status, data, error, refetch} = useQuery(myKey, fetchData, {
      manual: true,
    });

const onClick = () => { refetch() }

Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅react-query文档上的手动查询部分 https://github.com/tannerlinsley/react-query#manual-querying

  • 我认为“手动”(仍然存在)被“启用”(在 V2 中)取代。https://github.com/tannerlinsley/react-query#disabling-or-pausing-a-query (32认同)

小智 8

首先,反应查询为我们提供了启用选项,默认情况下它是 true

const fetchData = async()=>{...}

const {status, data, error , refetch} = useQuery(myKey, fetchData() , {
enabled : false
}
);

<button onClick={() => refetch()}>Refetch</button>
Run Code Online (Sandbox Code Playgroud)


hee*_*eez 8

有两个问题refetch()

  • 即使响应已被缓存并且staleTime尚未过期,它也会向服务器发送请求
  • 你不能将参数传递给它

onClick如果您需要对类似or 的事件进行查询onChange,请使用queryClient.fetchQuery()

function MyComponent() {
  const queryClient = useQueryClient();

  const handleOnClick = async () => {
    const data = await queryClient.fetchQuery({ queryKey, queryFn });
  }

  return <button onClick={handleOnClick}>My Button</button>;
}
Run Code Online (Sandbox Code Playgroud)

您可以看到创建者当前维护者推荐这种方法。


小智 7

看起来文档已更改并且现在缺少手动查询部分。但是,查看 useQuery API,您可能需要设置enabled为 false,然后refetch在按下按钮时使用手动查询。force: true无论数据新鲜度如何,您还可能希望使用它进行查询。