在React应用中,useQuery
通常用于数据的异步获取,并且它主要用于组件加载时自动触发数据获取。但你提到的场景是在表单的onSubmit事件中使用useQuery
,这实际上不是useQuery
的典型用例。对于基于事件的数据查询或操作,React Query提供了一个更适合的hook:useMutation
。
为什么使用useMutation
而不是useQuery
?
-
自动执行 vs 手动触发:
useQuery
在组件加载时自动执行,适合获取数据。useMutation
用于在某个事件触发时执行,适合提交、更新数据等操作。
-
状态管理:
useMutation
提供了更多的状态管理功能,如在请求过程中、成功后和失败时的状态管理。
如何在表单提交时使用useMutation
:
假设我们有一个提交用户信息的表单,我们希望在表单提交时调用一个API。首先我们需要安装react-query:
bashnpm install react-query
然后,我们可以创建一个使用useMutation
的组件:
jsximport React from 'react'; import { useMutation } from 'react-query'; function UpdateProfile() { const mutation = useMutation(data => { return fetch('/api/update-profile', { method: 'POST', body: JSON.stringify(data), headers: { 'Content-type': 'application/json; charset=UTF-8' } }); }); const handleSubmit = async (event) => { event.preventDefault(); const formData = new FormData(event.target); const data = Object.fromEntries(formData.entries()); mutation.mutate(data); }; return ( <form onSubmit={handleSubmit}> <input type="text" name="username" required /> <input type="email" name="email" required /> <button type="submit">Update Profile</button> {mutation.isLoading && <p>Updating...</p>} {mutation.isError && <p>Error occurred: {mutation.error.message}</p>} {mutation.isSuccess && <p>Profile Updated Successfully!</p>} </form> ); } export default UpdateProfile;
代码解释:
useMutation
的使用:useMutation
接受一个异步函数,这里是调用API来更新用户资料。
- 表单处理:
handleSubmit
函数处理表单提交事件,阻止默认事件,然后从表单中获取数据并使用mutation.mutate
进行数据提交。
- 状态反馈:
- 使用
mutation.isLoading
、mutation.isError
和mutation.isSuccess
来给用户提交状态的反馈。
- 使用
这样我们就可以在用户提交表单时,有效地使用React Query的useMutation
来处理数据的发送和状态管理。
2024年8月5日 11:26 回复