empty —— 空の状態
空の状態はリスト / テーブル / 検索結果の「データゼロ状態」です。core/empty の状態は極めてシンプルです——hasImage という真偽値 1 つだけ。なぜならその中核の視覚的意思決定とは「ユーザーが画像を渡したか、ライブラリのデフォルト水墨画を使うか」であり、この両者はレイアウトが異なるからです(カスタム画像は元の尺寸を尊重し、デフォルト画像は特製の全幅水墨画です)。
- 各端が
LhEmptyを実装する:テーブルのデータなし、検索結果なし、リストの空化、権限不足の提示。 - 水墨の空状態の視覚を再利用したいカスタムケース。
- 使うべきでない:読み込み中の状態。それは
LhSkeletonまたはLhLoadingの責務です。空の状態は「データがゼロであることが確定した」のであって「まだ来ていない」のではありません。
インポート方法
Section titled “インポート方法”import { getEmptyClassNames } from '@lh-ui/share/core/empty'import type { LhEmptyState } from '@lh-ui/share/core/empty'core/empty に hasImage 1 つしかフィールドがない理由は、それ以外のすべて(タイトル、説明、操作ボタン)が状態ではなく内容だからです——内容はスロット / props で直接レンダリングされ、計算を必要としません。内容まで core に通すのは間接層を増やすだけで利益がありません。
この「状態だけを計算し、内容は計算しない」という境界は lh-ui core 層の一般原則です:core 関数の入力は出力を変えるものであるべきです。
| 関数 | シグネチャ | 戻り値 | 役割 |
|---|---|---|---|
getEmptyClassNames |
(state: LhEmptyState) => string[] |
クラス名配列 | カスタム画像とデフォルト画像を区別 |
出力例:
getEmptyClassNames({ hasImage: true }) // ['lh-empty', 'lh-empty--custom-image']getEmptyClassNames({ hasImage: false }) // ['lh-empty']export interface LhEmptyState { hasImage: boolean}アクセシビリティ
Section titled “アクセシビリティ”core/empty は aria 属性パックを出力しません。空の状態のアクセシビリティの要点は UI 層にあります:
- 空の状態が現れたとき、その手前にあるリスト / テーブルは
aria-live="polite"を使うか、データの読み込み完了後に能動的に通知すべきです。そうでないとスクリーンリーダーのユーザーは「リストは 0 件」という古い認識にとどまります。 - デフォルトの水墨画は装飾的なため、
aria-hidden="true"にします(UI 層がレンダリング時に処理)。 - 説明テキストが本当の情報(「データがありません。ボタンをクリックして更新してください」など)を担い、読み可能でなければなりません。
- 空の状態に操作ボタンが含まれる場合、ボタン自体はネイティブのセマンティクスで十分です。
import { getEmptyClassNames } from '@lh-ui/share/core/empty'
getEmptyClassNames({ hasImage: false }) // ['lh-empty']<!-- Vue3 --><div :class="getEmptyClassNames({ hasImage: !!image })"> <div class="lh-empty__image"> <slot name="image"> <InkWash /> <!-- デフォルトの水墨プレースホルダー画像、aria-hidden --> </slot> </div> <p class="lh-empty__description">{{ description }}</p> <div class="lh-empty__actions"><slot name="actions" /></div></div>// Reactconst hasImage = !!imagereturn ( <div className={getEmptyClassNames({ hasImage }).join(' ')}> <div className="lh-empty__image">{image ?? <DefaultInkWash aria-hidden="true" />}</div> <p className="lh-empty__description">{description}</p> <div className="lh-empty__actions">{actions}</div> </div>)// uniapp:デフォルトの水墨画は svg で、非 h5 端では画像リソースに差し替える必要がある(各端の UI 層が処理)スタイルとトークン
Section titled “スタイルとトークン”| クラス名 | 意味 |
|---|---|
.lh-empty |
ベースクラス:中央揃え、縦方向の間隔 |
.lh-empty--custom-image |
カスタム画像:デフォルト画像の固定サイズの制約を解除 |
.lh-empty__image |
画像エリア |
.lh-empty__description |
説明テキスト(セカンダリの文字色) |
.lh-empty__actions |
操作ボタンエリア |
.lh-empty__illustration / __ink-* |
デフォルト水墨イラストの構成要素(遠山、水墨のにじみ、落款、画額) |
デフォルトの水墨イラストは lh-ui の中華風の署名要素の 1 つで、純粋な CSS / SVG で描かれ、ダークモードでは専用の調色があります。
hasImageの判定権は UI 層にあります:ユーザーがimageprop やimageスロットで何かを渡せば「カスタム画像あり」とみなされます。- 空の状態は本来データがあった位置(テーブル本体、リストコンテナの内側)に現れるべきで、全域に浮かぶ通知にしないでください——それはフィードバックではなく、データの一つの状態です。
- 404 / 権限なしのような「データが空なわけではない」ケースは、セマンティクス上はむしろ警告に近く、
LhEmptyよりLhResult(各端にあれば)やカスタムレイアウトのほうが適しています。
@lh-ui/share/core/empty → getEmptyClassNames( )返回值
(填好参数后点运行)Copyright © 2024-2026 FengMo WenXue