#react-query
#react-query
Вопрос:
Я новичок в react query и до сих пор люблю его. Я понимаю, что это в основном библиотека пользовательского интерфейса. Так что это отлично подходит для обработки / отображения ошибок, состояний загрузки. Но часто я ловлю себя на том, что хочу дождаться какого-то конкретного действия асинхронным способом. Итак, я хотел бы иметь возможность дождаться возврата обещания, прежде чем запускать действие, например, перенаправление.
Вот пример:
const NewPostForm = props => {
const history = useHistory();
const mutatePostInfo = useUpdatePost(); // useMutate hook
const [value, setValue] = useState("")
const handleSubmit = () => {
mutatePostInfo.mutate(value);
// I WANT TO: wait for the action to complete before redirecting
history.push("/new-route/")
}
return (
<form onSubmit={handleSubmit}>
<input value={value} onChange={(e) => setValue(e.target.value)} />
</form>
)
}
Ответ №1:
mutate
Функция, возвращаемая с помощью useMutation
, принимает опции в качестве второго аргумента, и вы можете использовать onSuccess
опцию для выполнения чего-либо, когда мутация завершается успешно:
mutatePostInfo.mutate(
value,
{
onSuccess: () => history.push("/new-route/")
}
);
Существует также onError
(для ошибок) и onSettled
обратный вызов (если вы хотите перенаправить в случае успеха или ошибки).
Комментарии:
1. Я пришел сюда в поисках чего-то другого, но я не применяю это и к своему коду, лол
2. Дополнение: если вы хотите
await
для разрешенияmutate
, вы можете обернуть весь вызов в обещание и разрешить его вonSuccess
(илиonSuccess
/onSettle
) следующим образом:await new Promise((resolve) => { mutatePostInfo.mutate(value, { onSuccess: () => resolve() }) });
Ответ №2:
для ожидания завершения других значений или функций, у которых нет функции onSuccess, вы можете использовать зависимые запросы для остановки запроса до тех пор, пока это значение не будет существовать / соответствовать вашим критериям.
const [payload, setPayload] = useState();
const someFunc = () => setPayload("data");
const { data } = useQuery(payload amp;amp; ["queryKey", { payload }],
queryName
);
someFunc();
будет ждать, пока полезная нагрузка не получит значение, в данном случае «данные», прежде чем отправлять запрос queryName, вы также можете передать функцию с возвращаемым значением, которая будет ждать этого возвращаемого значения.
Ответ №3:
Вы можете использовать зависимые запросы. Например:
// Get the user
const { data: user } = useQuery(['user', email], getUserByEmail)
const userId = user?.id
const { isIdle, data: projects } = useQuery(
['projects', userId],
getProjectsByUser,
{
// The query will not execute until the userId exists
enabled: !!userId,
}
)
// isIdle will be `true` until `enabled` is true and the query begins to fetch.
// It will then go to the `isLoading` stage and hopefully the `isSuccess` stage :)