Как получать существующие данные кеша при каждом изменении ввода?

В моем приложении есть пользовательский 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>
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Думаю, вам нужен queryClient.getQueryData(["rickandmorty", idQuery]). Это даст вам данные из кеша для определенного queryKey. Если это undefined, у вас нет данных в кеше для этого ключа, поэтому вы можете включить кнопку отправки.

Но вам нужно разрешить response-query управлять данными за вас, пожалуйста. Это означает, что ваша функция handleRickAndMortyFetch должна возвращаться как Promise - нет необходимости использовать локальное состояние (rickAndMortyCharacter) - это просто свойство data, возвращаемое из response-query

Спасибо, теперь приложение при каждом изменении входных данных будет извлекать данные, если входное значение отсутствует в кеше, и будет осуществлять доступ только из кеша, если входное значение существует внутри. Однако как отключить кнопку отправки, если входное значение существует в кеше. У меня disable определяется как const disable = isLoading || parseFloat(formId) === idQuery || cacheData.name === idQuery. Но я получаю TypeError: Cannot read property name of undefined.. Пожалуйста, взгляните на обновленный код.

ln09nv2 31.03.2021 03:31

Как я уже сказал, данные в кэше может не определены, если их не существует, поэтому я бы использовал необязательную цепочку: cacheData?.name === idQuery

TkDodo 31.03.2021 08:10

Спасибо за вашу помощь в использовании логики выборки при каждом изменении ввода! К сожалению, cacheData. и cacheData?. не работают. Я продолжу исследования, чтобы выяснить логику отключения. ??

ln09nv2 31.03.2021 23:58

Другие вопросы по теме