Don*_*al0 5 reactjs react-query
我使用react-query 的useMutation 挂钩将用户添加到api。有用。现在,我需要将新用户添加到我的用户数组中,该数组位于我的状态中。
我知道我应该使用 useQuery 查询所有用户,然后使用 useMutation 中的 onSuccess 来修改缓存。但在某些情况下,我不会使用 useQuery 获取用户,因此我需要更新本地状态,就像处理正常的 Promise 一样。
目前,我只是检查 prop“success” 是否为 true,如果是,则更新数组。但它仅在第二次单击时有效。为什么以及如何解决这个问题?
看来 onAddUser() 内的成功条件只有在第二次单击时才能达到。
export default function App() {
const { updateUser } = userService();
const { update, loading, error, data, success } = updateUser();
const [users, setUsers] = useState(allUsers);
const onAddUser = async () => {
await update(newUser);
if (success) {
return setUsers((users) => [...users, data]);
}
};
return (
<>
<div>
{users.map((user) => (
<div key={user.id}>
{user.name} - {user.job}
</div>
))}
</div>
{loading && <div>sending...</div>}
{error && <div>error</div>}
<button onClick={() => onAddUser()}>add user</button>
</>
);
}Run Code Online (Sandbox Code Playgroud)
这也是一个沙箱:https://codesandbox.io/s/usemutation-test-co7e9? file=/src/App.tsx:283-995
success从updateUser(我假设这是 useMutation 返回的结果)返回的 prop 将仅在下一个渲染周期更新。函数仍然会保留对其关闭的任何内容的引用,即使其中有异步等待。这与react-query 无关,这就是react 的工作原理。
我建议使用onSuccess变异函数的回调,或者使用mutateAsync并检查结果,但如果您使用mutateAsync. mutateAsync 您可以在这里阅读有关内容,我将向您展示一个mutate示例:
const { mutate, loading } = useMutation(() => ...);
const onAddUser = () =>
mutate(newUser, {
onSuccess: (newData) => setUsers((users) => [...users, data]);
});
};
Run Code Online (Sandbox Code Playgroud)
另外,请不要违反 hooks 规则。您只能从功能组件或其他挂钩(=以 开头的函数use)调用挂钩,但在您的codesandbox中,您可以useMutation从updateUser函数调用...
| 归档时间: |
|
| 查看次数: |
11170 次 |
| 最近记录: |