Состояния и загрузка данных
Smart-компонент показывает своё состояние — ошибку, пустой результат, ожидание — и сообщает о загрузке данных. Здесь — состояния и скелетоны на время загрузки.
Состояния
Состояние — то, от чего зависит показ компонента в данный момент. Глава описывает виды состояний, их объявление в манифесте и обязательные состояния данных.
Виды состояний
| Вид | Примеры | Кто задаёт |
|---|---|---|
| Визуальные | обычное, наведение, фокус, нажато, заблокировано | Компонент и CSS |
| Поведенческие | закрыт → открывается → открыт → закрывается | Компонент |
| Состояния данных | загрузка, есть данные, пусто, ошибка | Компонент показывает, приложение сообщает |
Как состояния объявляются
В манифесте у каждого компонента есть раздел state:
visual_states— визуальные состояния, которые компонент показывает;machines— именованные автоматы поведения: список состояний, через которые проходит компонент.
Ветвление шаблона по признаку, которого нет в манифесте, запрещено: вид выбирается только объявленными настройками.
Обязательные состояния данных
Компонент, который показывает данные приложения, объявляет как минимум четыре состояния — загрузка, есть данные, пусто, ошибка — и показывает текущее.
- Пока запрос выполняется, компонент не рисует придуманные данные.
- Незавершённая операция никогда не показывается как выполненная.
- Без своего серверного адреса компонент прямо сообщает, что возможность не подключена.
Граница состояния
- Компонент хранит открытие панели или выбранное значение.
- Корзина, права и сохранение — в проекте. После операции проект передаёт результат компоненту.
- Состояние, которое другой человек должен увидеть по ссылке, живёт в адресе
страницы. То, что человек поменял во внешнем виде, хранится как
персональный вид через
SF.Preferences; компонент не пишет в браузерное хранилище сам.
Смотрите также
- Граница ответственности — граница ответственности.
- Загрузка данных и скелетоны — загрузка данных и скелетоны.
- Разделы манифеста — раздел
stateманифеста. - Правила взаимодействия компонентов — пять состояний, скелетон для загрузки и
sf-empty-stateдля остальных как требования стандарта.
Загрузка данных и скелетоны
Глава описывает, как компонент показывает загрузку данных. Правила нужны, чтобы страница не сдвигалась после загрузки и не показывала устаревшие данные.
Правила:
- Во время загрузки компонент показывает состояние загрузки: у кнопок и полей —
атрибут
loading, у списков и таблиц — скелетон (sf-skeleton) по форме будущего содержимого. - Скелетон повторяет геометрию настоящего содержимого и берёт размеры из
лестницы текста: высота строки-заглушки равна размеру текста той же ступени
(
--sf-text-size-*). - Загрузка не блокирует остальную страницу и не скрывает уже показанные данные без причины.
- Ответ, который старше последнего запроса, отбрасывается: каждый экземпляр нумерует свои запросы.
Заготовка до прихода кода
Код Smart-компонента подгружается, когда элемент появляется на странице, и
до этого момента элемент пуст. Чтобы ничего не сдвигалось, когда код придёт,
элемент заранее занимает место своей будущей формы и показывает её полосками
скелетона. Форму называет атрибут data-sf-skeleton, который пишет разметка
сервера:
| Значение | Форма | Сколько |
|---|---|---|
rows |
список: панель инструментов и строки | --sf-skeleton-rows, по умолчанию 10 |
record |
запись: пары «подпись — значение» | --sf-skeleton-rows, по умолчанию 6 |
menu |
колонка меню | --sf-skeleton-rows, по умолчанию 8 |
block |
прямоугольник | высота --sf-skeleton-block-size, по умолчанию высота контрола размера 1 |
line |
одна строка текста | — |
<sf-data-view data-sf-skeleton="rows" style="--sf-skeleton-rows: 20"></sf-data-view>
<sf-property-view data-sf-skeleton="record"></sf-property-view>
Формы лежат в ядре, потому что собственные стили компонента приходят вместе
с его кодом — слишком поздно. Заготовка видна, только пока элемент не
определён (:not(:defined)), и пульсирует; при системной настройке
уменьшения движения она неподвижна. Когда код пришёл, компонент показывает
свой скелетон загрузки данных, если он у него есть, а затем данные или
пустое состояние.
При первой загрузке страницы заготовку не видно. Пока Loader не загрузил
модули, которые нашёл на странице, и не отправил sf-loader-ready, Core
держит страницу прозрачной, а заставка загрузчика (SF_BOOT_CONFIG.preloader,
по умолчанию включена) закрывает её. Заготовка видна у элемента, который
появился после sf-loader-ready: его вставил код страницы или принесла
навигация по областям. Атрибут
data-sf-skeleton всё равно пишут на сервере: он держит место элемента, и
поэтому после показа страницы ничего не сдвигается.
Какую форму компонент занимает до кода и рисует ли он свой скелетон, пока
ждёт данные, объявляет манифест: presentation.skeleton с полями shape
(rows, record, menu, block, line или none) и while_loading
(template или none). Форму объявляет каждый Smart-компонент.
none объявляют элементы в строке текста и то, что открывается поверх
страницы: заготовка до прихода кода сдвинула бы строку, в которой элемент
стоит. Какую форму назвал каждый компонент — в таблице ниже и в справочнике
компонента (строка «Заготовка до прихода кода»).
Формы компонентов
Раздел собран из манифестов выпуска ui-106d5901f8c3 и пакетов и обновляется вместе с ними. Форму объявляет presentation.skeleton.shape, свой скелетон при загрузке данных — while_loading: template.
| Форма | Компоненты |
|---|---|
rows |
<sf-data-view> (свой скелетон), <sf-table> (свой скелетон) |
record |
<sf-property-view> (свой скелетон) |
menu |
<sf-admin-menu>, <sf-tree> |
block |
<sf-alert>, <sf-color>, <sf-country-code>, <sf-datepicker>, <sf-empty-state>, <sf-file-preview>, <sf-file-upload>, <sf-gallery>, <sf-inline-editor>, <sf-input>, <sf-page-header>, <sf-pagination>, <sf-profile-picker>, <sf-range-slider>, <sf-slider>, <sf-steps>, <sf-tabs>, <sf-textarea>, <sf-theme-generator> |
line |
<sf-breadcrumbs>, <sf-list-item>, <sf-tree-item> |
none |
<sf-avatar>, <sf-avatars>, <sf-badge>, <sf-button>, <sf-button-group>, <sf-checkbox>, <sf-close>, <sf-composition-overlay>, <sf-context-menu>, <sf-copy-button>, <sf-download-file>, <sf-drawer>, <sf-dropdown>, <sf-help-mark>, <sf-icon>, <sf-icon-button>, <sf-modal>, <sf-popover>, <sf-progress-bar>, <sf-progress-scale>, <sf-radio>, <sf-reference-link>, <sf-resizer>, <sf-skeleton>, <sf-sortable>, <sf-spinner>, <sf-switch>, <sf-tag>, <sf-toast>, <sf-toggle>, <sf-tooltip> |
Скелетон области страницы
Когда навигация по областям меняет содержимое страницы, а ответ сервера
задерживается дольше 150 мс, область получает атрибут
data-sf-region-loading и aria-busy="true". Ядро рисует в ней скелетон
страницы: полосу заголовка и строки текста. Уходящее содержимое скрыто, но
занимает своё место, поэтому область сохраняет размер и ничего ниже неё не
сдвигается. Оболочка вокруг области не меняется. Скелетон пульсирует, а при
системной настройке уменьшения движения неподвижен, как и заготовки до
прихода кода. Когда ответ пришёл, оба атрибута снимаются.
Атрибут работает на любом элементе: продукт может поставить его сам, пока перезагружает область своим кодом, и снять, когда содержимое готово:
<main id="shop-content" data-sf-region-loading aria-busy="true">…</main>
Смотрите также
- Обязательные состояния данных — обязательные состояния данных.
- Динамический составной компонент — упорядоченные ответы динамического компонента.
- Навигация по областям страницы — когда область получает скелетон.
Пустые состояния
Когда ответ пришёл, а показать нечего, составной компонент показывает
пустое состояние — один и тот же
блок <sf-empty-state> во всех компонентах. Порядок всегда один: пока идёт
запрос — скелетон, после ответа — либо данные, либо пустое состояние. Скелетон
не остаётся на месте пустого ответа: человек не должен ждать того, что не
придёт.
Причину выбирает компонент
Составной компонент знает, что ответило приложение и включены ли поиск и фильтры, поэтому причину выбирает сам; приложению ничего настраивать не нужно.
| Что произошло | Причина (kind) |
Действие |
|---|---|---|
приложение ответило refused на запрос списка (query.change) — нет прав |
no-access |
— |
unavailable или запрос не выполнился |
error |
«Повторить» — тот же запрос ещё раз |
| записей нет, включены поиск или фильтры | nothing-found |
«Очистить поиск», «Сбросить фильтры» или «Сбросить поиск и фильтры» — по тому, что включено |
| записей нет, поиска и фильтров нет | no-data |
«Создать», если приложение разрешает создание — то же намерение, что у кнопки на панели инструментов |
Две формы
- Полная — значок, заголовок, пояснение и действия. Для таблицы, панели и
целой страницы. Размер следует размеру хозяина: таблица размера 1/2 показывает
пустое состояние размера 1/2. Заголовок — настоящий заголовок третьего
уровня. Другой уровень задаёт блок в слоте
emptyтаблицы атрибутомheading-level: на странице списка, гдеh1— сама коллекция, это 2, в разделе страницы подh2— 3, в панели — 3 или 4. - Компактная (
layout="inline"илиsize="1/3") — одна строка высотой с контрол 1/2: маленький значок, текст и не больше одного действия-ссылки, без заголовка. Для списков в меню, выпадающих списках и поиске. Внутри списка (listbox,menu) её ставят вне элемента списка, чтобы стрелки её пропускали и она не считалась пунктом.
Слова
Тексты по умолчанию — на языке страницы: «Пока ничего нет», «Ничего не
найдено», «Нет доступа», «Не удалось загрузить». Свои слова дают уже
существующие тексты компонента: у таблицы empty-text становится заголовком
состояния «нет записей», error-text — заголовком ошибки. Для полной замены у
таблицы есть слот empty: всё, что в нём, показывается вместо блока.
Объявление для экранного диктора
«Ничего не найдено» и ошибка объявляются вежливо, остальные причины — нет.
Если ошибка случилась после действия человека — он изменил поиск или фильтр, —
она объявляется сразу (role="alert"). Компонент, который объявляет сам,
ставит пустому состоянию live="off".
Где это уже работает
- Представление данных (
sf-tableиsf-data-viewпакета Larena) — все четыре причины. Отдельная таблица без представления данных не знает о поиске и показывает только «нет записей» и ошибку. - Панель свойств Larena — запись, которую не удалось загрузить или на которую нет прав, объясняет причину тем же блоком.
Смотрите также
- Пустое состояние — сам компонент.
- Загрузка данных и скелетоны — что показывается до ответа.