Обработка двух ключей кэша для одних и тех же данных в React-QueryJavascript

Форум по Javascript
Ответить
Anonymous
 Обработка двух ключей кэша для одних и тех же данных в React-Query

Сообщение Anonymous »

У меня есть тип проекта в моем приложении. Мне нужно иметь возможность получить к нему доступ с помощью двух отдельных асинхронных функций: < /p> В корне страницы я использую URL для получения слизняка и запроса для него, используя usegetProductbyslugquery Hook ( с QueryKey из продуктов [

Код: Выделить всё

, productSlug]
), но везде в иерархии компонентов, где мне нужно получить доступ к проекту, который я использую useProductByIdquery Hook (с QueryKey из [ продуктов

Код: Выделить всё

, productId]
), и существует множество других крючков, которые обновляют проекты, которые используют этот QueryKey . Сама по себе не является проблемой, это также означает, что один и тот же ресурс хранится в двух разных местах в кеше. Это проблематично, потому что: < /p>

[*] Любые крючки, которые используют продукты [< /code>

Код: Выделить всё

, productId]
не будет запущен, когда [ продукты

Код: Выделить всё

, productSlug]
обновляется или недействительна.
Любые крючки, которые используют продукты [

Код: Выделить всё

, productSlug]
не будет запущен, когда [ продукты

Код: Выделить всё

, productId]
обновляется или недействительна. >
вручную обновлять / недействителен оба клавиша в каждом крючке, который использует любой ключ. Это включает в себя много дублированной логики и является очевидным потенциальным источником ошибок. запускается только тогда, когда запрос с использованием [ проектов

Код: Выделить всё

, projectSlug]
удается в возвращении проекта. Что-то вроде этого: < /p>
< /li>
< /ol>

Код: Выделить всё

const useCopyProjectToCacheQuery = (project: Project) => {
const queryClient = useQueryClient()
return useQuery({
queryKey: projectKeyFactory.project(project?.id),
queryFn: async () => {
// Check the cache for data stored under the project's id
const projectDataById = await queryClient.getQueryData(
projectKeyFactory.project(project.id)
)

return isNil(projectDataById)
? // If the data isn't found, copy the data from the project's slug key
await queryClient.getQueryData(
projectKeyFactory.project(project.id)
)
: // Otherwise get it from the server
await findProjectByIdAction(project.id)
},
enabled: isNotNil(project),
})
}
Это заполнит проекты [

Код: Выделить всё

, projectId]
ключ с проектом из проектов [

Код: Выделить всё

, projectSlug]
Ключ, когда он сначала заполняется, затем запустит обычный запрос на последующие вызовы. решить проблему. Следующим образом было подписаться на QueryCache и скопировать данные из каждого ключа на другой, когда изменяется один из ключей, однако документы для QueryCache.subscribe Состояние:

Из применения мутаций в кеш не поощряются и не будут стрелять из обратных вызовов подписки < /p>
< /blockquote>
Так что правильно способ справиться с этой ситуацией?

Подробнее здесь: https://stackoverflow.com/questions/794 ... eact-query
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»