createResource¶
При этом создается сигнал, возвращающий результат выполнения асинхронного запроса.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
Функция createResource
принимает асинхронную функцию fetcher и возвращает сигнал, который по завершении работы fetcher обновляется результирующими данными.
Существует два варианта использования createResource
: можно передать функцию fetcher в качестве единственного аргумента, а можно дополнительно передать в качестве первого аргумента исходный сигнал. Сигнал источника будет перезапускать fetcher при каждом его изменении, а его значение будет передаваться в fetcher.
1 2 |
|
1 2 3 4 |
|
В этих фрагментах считывателем является функция fetchData
, а data()
остается неопределенной до тех пор, пока fetchData
не завершит разрешение. В первом случае fetchData
будет вызвана немедленно. Во втором случае fetchData
будет вызвана, как только sourceSignal
примет любое значение, отличное от false, null или undefined. Она будет вызываться каждый раз, когда значение sourceSignal
изменится, и это значение всегда будет передаваться в fetchData
в качестве первого аргумента.
Вы можете вызвать mutate
для прямого обновления сигнала data
(это работает как любой другой установщик сигнала). Также можно вызвать функцию refetch для повторного запуска фетчера напрямую и передать дополнительный аргумент для предоставления дополнительной информации фетчеру, например refetch(info)
.
data
работает как обычный геттер сигнала: используйте data()
для чтения последнего возвращенного значения fetchData
. Но у него есть и дополнительные реактивные свойства: data.loading
сообщает, был ли вызван фетчер, но не вернулся, а data.error
сообщает, был ли запрос ошибочным; если да, то в нем содержится ошибка, выброшенная фетчером. (Примечание: если вы ожидаете ошибок, то, возможно, захотите обернуть createResource
в ErrorBoundary).
Начиная с v1.4.0, data.latest
возвращает последнее возвращенное значение и не вызывает Suspense и переходов; если значение еще не было возвращено, data.latest
действует так же, как data()
. Это может быть полезно, если необходимо показать устаревшие данные, пока загружаются новые.
loading
, error
и latest
являются реактивными геттерами и могут быть отслежены.
Фетчер¶
Функция fetcher
- это асинхронная функция, которую вы предоставляете createResource
для получения данных. Ей передаются два аргумента: значение исходного сигнала (если оно задано) и объект info с двумя свойствами: value
и refetching
. Свойство value
сообщает о ранее полученном значении. Свойство refetching
равно true, если fetcher
был вызван с помощью функции refetch, и false в противном случае. Если функция refetch
была вызвана с аргументом (refetch(info)
), то свойство refetching устанавливается на этот аргумент.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
Также можно передать несколько сигналов в качестве источника, построив производный сигнал:
1 2 3 4 5 6 7 8 |
|
Обратите внимание на as const
. Это необходимо для того, чтобы typescript правильно определил типы аргументов fetcher'а: dataVal
и moreDataVal
. В качестве альтернативы их можно явно типизировать при передаче в fetcher:
1 2 3 4 5 |
|
Версия 1.4.0 и более поздняя¶
v1.4.0¶
Если вы используете renderToStream
, то с помощью опции deferStream
можно указать Solid на необходимость ожидания ресурса перед очисткой потока:
1 2 3 4 5 6 7 |
|
v1.5.0¶
-
Мы добавили новое поле состояния, которое позволяет получить более подробную информацию о состоянии ресурса, чем
loading
иerror
. Теперь можно проверить, является ли ресурсunresolved
,pending
,ready
,refreshing
илиerror
.Состояние Значение разрешено Загрузка Есть ошибка unresolved
No No No pending
No Yes No ready
Yes No No refreshing
Yes Yes No error
No No Yes -
При серверном рендеринге ресурсов, особенно при выборке при встраивании Solid в другие системы, которые выполняют выборку перед рендерингом, вы можете захотеть инициировать ресурс с этим предварительно полученным значением вместо повторной выборки и сериализации ресурса в его собственном состоянии. Для этого можно использовать новую опцию
ssrLoadFrom
. Вместо значения по умолчаниюserver
можно передатьinitial
, и ресурс будет использоватьinitialValue
, как если бы это был результат первой выборки как для SSR, так и для гидратации.1 2 3 4 5 6 7 8
const [data, { mutate, refetch }] = createResource( () => params.id, fetchUser, { initialValue: preloadedData, ssrLoadFrom: 'initial', } );
-
Ресурсы могут быть установлены с пользовательским хранилищем с той же сигнатурой, что и Сигнал, с помощью опции хранилища. Например, использование пользовательского хранилища сверки может быть выполнено следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
function createDeepSignal<T>(value: T): Signal<T> { const [store, setStore] = createStore({ value, }); return [ () => store.value, (v: T) => { const unwrapped = unwrap(store.value); typeof v === 'function' && (v = v(unwrapped)); setStore('value', reconcile(v)); return store.value; }, ] as Signal<T>; } const [resource] = createResource(fetcher, { storage: createDeepSignal, });
Данная опция пока является экспериментальной и может быть изменена в будущем.
Опции¶
Функция createResource
принимает необязательный третий аргумент - объект options. Опциями являются:
Имя | Тип | По умолчанию | Описание |
---|---|---|---|
name | string | undefined | Имя ресурса. Оно используется для отладки. |
deferStream | boolean | false | Если значение равно true , то Solid будет ждать разрешения ресурса перед очисткой потока. |
initialValue | any | undefined | Начальное значение ресурса. |
onHydrated | function | undefined | Обратный вызов, который вызывается при гидратации ресурса. |
ssrLoadFrom | "server" | "initial" | "server" | Источник начального значения для SSR. Если установлено значение "initial" , то ресурс будет использовать опцию initialValue вместо значения, возвращаемого fetcher'ом. |
storage | function | createSignal | Функция, возвращающая сигнал. Это может быть использовано для создания пользовательского хранилища для ресурса. Это пока экспериментальная версия |