В моем приложении есть пользовательский input, id для отправки как request и response data, который соответствует рендерингу id.
Если data уже существует в cache, я бы хотел, чтобы приложение загружалось с cache на каждом input change.
Если data не существует в cache, приложение может отправить request, только если пользователь щелкнет submit button.
Как только пользователь вводит input, я обращаюсь к cache и проверяю, существует ли текущий вход id на каждом input change. Если да, визуализируйте data, а submit button - disabled. В противном случае используйте enable и submit button, чтобы пользователь мог отправить request.
Судя по исследованиям, я считаю, что мне нужно React Query queryClient.getQueryCache. Я бы проверил, существует ли входной id в cache, используя .includes на queryCache. Что бы я делал потом? Это правильное направление для реализации функциональности?
Вот моя текущая установка. Пожалуйста, дайте мне знать, как продолжить реализацию запрошенных функций. https://codesandbox.io/s/rick-and-morty-2gy8r?file=/src/App.js
const handleRickAndMortyFetch = () => {
return delay()
.then(() => axios(`https://rickandmortyapi.com/api/character/${idQuery}`))
.then((res) => res.data);
};
const cacheData = queryClient.getQueryData(["rickandmorty", idQuery], {
exact: false
})
const onInputChange = event => {
setIdQuery(event.target.value, () => {
cacheData.includes(idQuery)
handleRickAndMortyFetch()
})
}
const disable = isLoading || parseFloat(formId) === idQuery || !idQuery || cacheData?.id === idQuery;
<form onSubmit = {handleSubmit(onSubmit)}>
<input
type = "number"
name = "rickAndMortyId"
placeholder = "Between 1 and 671"
ref = {register}
disabled = {isLoading}
onChange = {onInputChange}
/>
<button type = "submit" disabled = {disable}>
Search Character
</button>
</form>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Думаю, вам нужен queryClient.getQueryData(["rickandmorty", idQuery]). Это даст вам данные из кеша для определенного queryKey. Если это undefined, у вас нет данных в кеше для этого ключа, поэтому вы можете включить кнопку отправки.
Но вам нужно разрешить response-query управлять данными за вас, пожалуйста. Это означает, что ваша функция handleRickAndMortyFetch должна возвращаться как Promise - нет необходимости использовать локальное состояние (rickAndMortyCharacter) - это просто свойство data, возвращаемое из response-query
Как я уже сказал, данные в кэше может не определены, если их не существует, поэтому я бы использовал необязательную цепочку: cacheData?.name === idQuery
Спасибо за вашу помощь в использовании логики выборки при каждом изменении ввода! К сожалению, cacheData. и cacheData?. не работают. Я продолжу исследования, чтобы выяснить логику отключения. ??
Спасибо, теперь приложение при каждом изменении входных данных будет извлекать данные, если входное значение отсутствует в кеше, и будет осуществлять доступ только из кеша, если входное значение существует внутри. Однако как отключить кнопку отправки, если входное значение существует в кеше. У меня
disableопределяется какconst disable = isLoading || parseFloat(formId) === idQuery || cacheData.name === idQuery. Но я получаюTypeError: Cannot read property name of undefined.. Пожалуйста, взгляните на обновленный код.