Загрузка ресурса при изменении состояния
В этом руководстве мы хотим получить список репозиториев для заданной организации GitHub. Чтобы помочь вам, мы добавили в нижнюю часть файла функцию getRepositories(). Ваша задача - использовать getRepositories() для получения списка репозиториев каждый раз, когда пользователь обновляет элемент org.
Qwik предоставляет useResource$() и <Resource>, чтобы помочь вам получить и отобразить данные с сервера. При получении данных приложение может находиться в одном из трёх состояний:
pending: идёт получение данных с сервера => Отображается индикаторзагрузка...;resolved: данные успешно получены с сервера => Отображение данных;rejected: данные не могут быть получены с сервера из-за ошибки => Отображение ошибки.
Используйте функцию useResource$(), чтобы настроить способ получения данных с сервера. Используйте <Resource> для отображения данных.
Получение данных
Используйте useResource$(), чтобы настроить способ получения данных с сервера.
const reposResource = useResource$<string[]>(({ track, cleanup }) => {
// Нам нужен способ повторного получения данных при каждом
// изменении `github.org`. Используйте `track` для
// повторного запуска этой функции получения данных.
track(() => github.org);
// Хорошей практикой является использование `AbortController`
// для прерывания получения данных, если поступает новый запрос.
// Мы создаем новый `AbortController` и регистрируем функцию
// `cleanup`, которая вызывается при повторном запросе.
const controller = new AbortController();
cleanup(() => controller.abort());
// Получаем данные и возвращаем промис.
return getRepositories(github.org, controller);
});Функция useResource$() возвращает объект ResourceReturn, который представляет собой объект, подобный промисам, и может быть сериализован Qwik. Функция useResource$() позволяет с помощью track отслеживать свойства хранилища для того, чтобы функция useResource$() могла реагировать на изменения состояния. Функция cleanup позволяет зарегистрировать код, который необходимо выполнить, чтобы освободить ресурсы от предыдущего запроса. Наконец, функция useResource$() возвращает промис, который разрешается в значение.
Рендер данных
Используйте <Resource> для отображения данных функции useResource$(). <Resource> позволяет вам отображать различное содержимое в зависимости от текущего состояния ресурса: pending, resolved или rejected.
На сервере <Resource> не отображает состояние loading, вместо этого он приостанавливает рендер до тех пор, пока ресурс не будет разрешён, и всегда будет отображаться либо как resolved, либо как rejected (на клиенте <Resource> отображает все состояния, включая pending).
<Resource
value={resourceToRender}
onPending={() => <div>Загрузка...</div>}
onRejected={(reason) => <div>Ошибка: {reason}</div>}
onResolved={(data) => <div>{data}</div>}
/>Сервер vs Клиент
Обратите внимание, что один и тот же код может рендериться как на сервере, так и на клиенте (с немного другим поведением, которое пропускает при рендере состояние pending на сервере).