【发布时间】:2021-05-17 13:32:27
【问题描述】:
我使用 react-query 的 useMutation 钩子将用户添加到 api。有用。现在,我需要将新用户添加到处于我状态的用户数组中。
我知道我应该使用 useQuery 查询所有用户,然后在 useMutation 中使用 onSuccess 来修改缓存。但在某些情况下,我不会使用 useQuery 获取用户,因此我需要像使用普通承诺一样更新本地状态。
目前,我只是检查道具“成功”是否为真,如果是,我更新数组。但它只适用于第二次点击。为什么以及如何解决这个问题?
似乎 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>
</>
);
}
这里也是一个沙盒:https://codesandbox.io/s/usemutation-test-co7e9?file=/src/App.tsx:283-995
【问题讨论】:
-
我认为这是因为查询的异步性质。当您在
onAddUser中执行 update() 时,它会异步评估,因此只有下一次才会成功。尝试添加const update = await update(newUser),并在下一行计算update.success。
标签: reactjs react-query