Reactは一般的なスケルトン画面コンポーネントの例を実装します

Reactは一般的なスケルトン画面コンポーネントの例を実装します

スケルトンスクリーンとは何ですか?

この場所を発見した同志たちは、スケルトンスクリーンについて多かれ少なかれ知識を持っています。まずは一言言わせてください。スケルトン スクリーンは、ユーザーの弱いネットワーク エクスペリエンスを最適化し、待機中のユーザーの不安を効果的に軽減するソリューションです。

デモ

まずはデモを見て、最終製品の概要と使い方をざっと把握してみましょう。

npm で obiusm-react-components をインストールします
'obiusm-react-components' から { Skeleton } をインポートします。
  <スケルトン isVisible={true}>
    <div className="ラッパー">
      <div className="content1"></div>
      <div データスケルトン無視 = {true}> 123456</div>
      <div className="content2"></div>
      <div className="content3" データスケルトンスタイル={{ width: '50%' }}></div>
    </div>
  </スケルトン>

記述したコンポーネントの周りにレイヤーをラップするだけで、表示されるかどうかが決まります。

デザインのアイデア

スケルトンにより、ユーザーは実際のコンテンツが読み込まれる前にそれを認識できるため、ユーザー エクスペリエンスが向上します。作成するコンポーネントごとにスケルトンをカスタマイズする必要がある場合、非常に面倒になります。

React props のデータ転送方法のおかげで、props 内の ReactElement ツリー全体を簡単に取得できます。 次に、ツリーを再帰的に走査してその構造を模倣し、そのクラスをコピーしてスケルトンを自動的に生成するだけです。

しかし、実際の使用では、ツリー全体の構造をシミュレートせずに、最初の数層の構造のみが必要になる場合があります。また、自動的に生成されたスタイルが醜すぎるため、ノード スタイルをカスタマイズする必要がある可能性もあります。また、一部のフローティング レイヤー コンテンツに注意を払う必要がない場合や、特定のノードを無視したい場合もあります。

したがって、おそらく次の機能を実装する必要があるでしょう

  • 再帰の深さの設定
  • ノードを無視する方法を提供する
  • スケルトンノードのスタイルをカスタマイズするためのメソッドを提供します

具体的な実装

まず、スケルトン画面をレンダリングするか、実際の要素をレンダリングするかを決定するコンポーネント関数を定義します。

関数 Skeleton(props: Props) {
  もし (!props) {
    <div /> を返します。
  }
  (props.isVisible)の場合{
    createModal(props.children, props.depth || 4, 0) を返します。
  } それ以外 {
    props.children を返します。props.children: <div />;
  }
}

createModal は、Skeleton の下にラップされた div を再帰的にトラバースします。再帰するたびに、current に 1 を追加して下に渡します。このようにして、再帰のレイヤーがいくつ作成されたか、各ノードの data-skeleton-ignore に data-skeleton-style があるかどうかを判断し、特別に処理することができます。

const createModal = (子: ReactElement、深さ: 数値、現在: 数値) => {
  もし (
    深さ === 現在の ||
    (子 && child.props && child.props['data-skeleton-ignore'])
  ){
    戻る;
  }
  もし (
    子供 &&
    子.props &&
    子.props.children &&
    Array.isArray(child.props.children) &&
    現在の深さ < 1
  ){
    戻る (
      <div
        クラス名={`${
          child.props.className !== 未定義 ? child.props.className : ''
        } ${'react-skeleton'}`}
        スタイル={
          child.props && child.props['データスケルトンスタイル']
            ? child.props['データスケルトンスタイル']
            : {}
        }
        キー={Math.random() * 1000}
      >
        {child.props.children && child.props.children.length > 0
          ? child.props.children.map((child: any) => {
              createModal(child, depth, current + 1) を返します。
            })
          : '*'}
      </div>
    );
  } それ以外 {
    戻る (
      <div
        クラス名={`${
          child.props && child.props.className ? child.props.className : ''
        } ${'react-skeleton2'}`}
        スタイル={
          child.props && child.props['データスケルトンスタイル']
            ? child.props['データスケルトンスタイル']
            : {}
        }
        キー={Math.random() * 1000}
      >
        *
      </div>
    );
  }
};

完全なコードと使用方法のドキュメント

完全なコード obiusm-react-components

ドキュメント https://magic-zhu.github.io/obiusm-react-components-docs/components/skeleton/

これで、React を使用した一般的なスケルトン スクリーン コンポーネントの例の実装に関するこの記事は終了です。React スケルトン スクリーンに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • WeChatアプレットのスケルトン画面の実装例
  • Vueプロジェクトでスケルトンスクリーンを使用する方法
  • WeChatアプレットでスケルトンスクリーンを使用する方法
  • Taroアプレットにスケルトン画面実装コードを追加
  • Vueプロジェクトのスケルトンスクリーンインジェクションの実践についての簡単な説明
  • VUEシングルページアプリケーションスケルトンスクリーンソリューションの詳細な説明
  • Vue ページ スケルトン スクリーン インジェクション メソッド
  • Vueシングルページスケルトン画面実践記録について

<<:  メタタグのビューポートはデバイス画面のCSSを制御します

>>:  CSS3を使用してフォントカラーグラデーションを実装する

推薦する

VueRouterルーティングの詳細な説明

目次vueルーター1. ルーティングの概念を理解する1.1 ルーティングとは何ですか? 1.2. バ...

CSS3の新しい背景プロパティの詳細な説明

これまで、CSS の背景の属性には、color、image、repeat、attachment、po...

HTML doctype の役割の紹介

ドキュメント モードには次の 2 つの機能があります。 1. HTML文書を解析するためにどのHTM...

Docker-compose を使用して GitLab をデプロイする方法

Docker-compose は GitLab をデプロイします1. Dockerをインストールする...

Vue で SVG アイコンを導入する 2 つの方法

Vue で SVG アイコンを導入する方法Vue で svg アイコンを導入する方法 1インストール...

MySQLのINサブクエリによってインデックスが使用できなくなる問題を解決する

今日は、MySQL IN サブクエリの最適化に関するケーススタディを見ました。最初は少し懐疑的でした...

MySQL マルチテーブル共同クエリ操作例の分析

この記事では、MySQL のマルチテーブル共同クエリ操作について説明します。ご参考までに、詳細は以下...

雨滴効果を実現する JavaScript キャンバス

この記事の例では、雨滴効果を実現するためのキャンバスの具体的なコードを参考までに共有しています。具体...

MySQL 5.7 でパスワードを変更するときに発生する ERROR 1054 (42S22) の解決方法

MySQL 5.7 を新しくインストールしました。ログインすると、パスワードが間違っているというメッ...

Linux での wget コマンドの基本的な使い方

目次序文1. wgetを使用して単一のファイルをダウンロードする2. wget -Oを使用してダウン...

Nginxはクロスドメインの問題を解決し、サードパーティのページを埋め込む

目次序文困難クロスドメイン定義nginxの機能リバースプロキシ静的と動的の分離達成しようとする最終結...

Vueのイベント処理とイベント修飾子の詳細な説明

<div id="ルート"> <h2>頑張れ、{{na...

Vue コンポーネント (Vuex を含む) 間の値の転送に関する簡単な説明

目次父から息子へ:息子から父へ: Vuex を使用せずにコンポーネント間で値を渡す方法は、親から子、...

CSS3 とテーブルタグを使用して円軌道アニメーションを実装するためのサンプルコード

html: 実際には、テーブルタグに従っていくつかの実線の円 div を正六角形に配置し、div コ...

CSS で要素を垂直方向に中央揃えする 7 つの方法

【1】中央の要素の幅と高さを知る絶対値 + 負のマージンコードの実装 .wrapBox5{ 幅: 3...