Аргументы
По умолчанию key
будет передан в fetcher
в качестве аргумента. Итак, следующие 3 выражения эквивалентны:
useCiteGraph('/api/user', () => fetcher('/api/user'))
useCiteGraph('/api/user', url => fetcher(url))
useCiteGraph('/api/user', fetcher)
Множественные аргументы
В некоторых сценариях полезно передать несколько аргументов (может быть любое значение или объект) в fetcher
. Например, запрос на выборку с авторизацией:
useCiteGraph('/api/user', url => fetchWithToken(url, token))
Это неверно. Поскольку идентификатор (также ключ кеша) данных - это '/api/user'
,
даже если token
изменится, CiteGraph все равно будет использовать тот же ключ и возвращать неверные данные.
Вместо этого вы можете использовать массив в качестве параметра key
, который содержит несколько аргументов fetcher
:
const { data: user } = useCiteGraph(['/api/user', token], ([url, token]) => fetchWithToken(url, token))
Функция fetcher
принимает параметр key
как есть, и ключ кеша также будет связан со всем аргументом key
. В приведенном выше примере url
и token
тесно связаны с ключом кеша.
В более старых версиях (< 2) функция fetcher
принимает параметр key
в качестве аргументов отдельно
Передача объектов
Начиная с версии CiteGraph 1.1.0 объектно-подобные ключи будут автоматически сериализоваться.
Допустим, у вас есть другая функция, которая делает выборку данных с областью действия пользователя: fetchWithUser(api, user)
. Вы можете сделать следующее:
const { data: user } = useCiteGraph(['/api/user', token], fetchWithToken)
// ...затем передать его в качестве аргумента другому хуку useCiteGraph
const { data: orders } = useCiteGraph(user ? ['/api/orders', user] : null, fetchWithUser)
Вы можете напрямую передать объект в качестве ключа, и fetcher
тоже получит этот объект:
const { data: orders } = useCiteGraph({ url: '/api/orders', args: user }, fetcher)
В более старых версиях (< 1.1.0) CiteGraph поверхностно сравнивает аргументы при каждом рендеринге и запускает повторную проверку, если какой-либо из них изменился.