Vueでスケルトンスクリーンを実装する例

Vueでスケルトンスクリーンを実装する例

スケルトンスクリーンの使用

  • spa におけるルート切り替えのローディングとして、コンポーネントのライフサイクルと ajax リクエストの戻りのタイミングと組み合わせて使用​​します。(ローディングとして使用)ユーザーと最も密接な関係を持つフロントエンド開発者にとって、ユーザーエクスペリエンスは最も注意を払うべき問題です。ページの読み込み状況の表示に関しては、読み込み画像と進行状況バーの 2 つが主流です。さらに、ますます多くのアプリが「スケルトン スクリーン」方式を使用してアンロードされたコンテンツを表示し、ユーザーにまったく新しい体験を提供しています。
  • 最初の画面レンダリングの最適化として

Vueアーキテクチャスケルトンスクリーン

アイデアの概要

  • 抽象コンポーネントを定義し、抽象コンポーネントのレンダリング関数のスロットを取得します。
  • スロットを深くループし、各要素にgm-skeletonのクラス名を追加します。
  • スケルトン画面が表示されたときにデフォルトのテキストが表示されないように、事前に一時停止して vnode textContent をクリアします。
  • リターンスロット

抽象コンポーネントの定義

抽象コンポーネントとは何ですか? レンダリング中にスキップされ、実行時操作のみを実行するコンポーネントです。

    エクスポートデフォルト{
      名前: 'GmSkeleton'、
      abstract: true // 抽象コンポーネントのプロパティ}

スロットを取得し、操作スケルトン画面を初期化する

    レンダリング(h) {
      const スロット = this.$slots.default || [h('')]
      this.$nextTick().then(() => {
        this.handlerPrefix(スロット、this.showSpin ? this.addSkeletPrefix : this.removeSkeletPrefix)
      })

      スロットの長さが1より大きい場合、h('div', {
         静的クラス: this.showSpin ? 'g-spinner' : ''
      }, スロット) : スロット
    }

ここでは、handlerPrefix が実際の DOM を取得する必要があるため、スロット処理メソッドを nextTick に配置します。NextTick は、ソートされた更新キュー内のすべてのメソッドを実行するために使用されます。レンダリングを実行する前に、GMSkeleton コンポーネントの renderWatcher が更新キューに収集されています。そのため、nextTick CallBack 関数は、レンダリング後に対応するスロット内のすべての実際の DOM を取得できます。nextTick の原理がわからない場合は、nextTick についてわからないことを参照してください。

サイクルスロット操作クラス名

    handlerComponent(スロット、handler/* addSkeletPrefix | removeSkeletPrefix */、init) {
      const originchildren = (((slot.componentInstance || {})._vnode || {}).componentOptions || {}).children
      const compchildren = ((slot.componentInstance || {})._vnode || {}).children
      !init && ハンドラ(スロット)
      if (compchildren) this.handlerPrefix(compchildren, handler, false)
      if (originchildren) this.handlerPrefix(originchildren, handler, false)
    },
    handlerPrefix(スロット、ハンドラー、init = true) {
      スロット.forEach(スロット => {
        var children = slot.children || (slot.componentOptions || {}).children || ((slot.componentInstance || {})._vnode || {}).children
        if (スロットデータ) {
          スロットコンポーネントオプションの場合
            !init && ハンドラ(スロット)
          } そうでない場合 (!this.$hoc_utils.getAbstractComponent(スロット)) {
            ;(関数(スロット) {
              const handlerComponent = this.handlerComponent.bind(this, slot, handler, init)
              const 挿入 = (slot.data.hook || {}).挿入
              ;(slot.data.hook || {}).insert = () => { // 関数のリファクタリング、元のコンポーネントフックを変更し、挿入が 1 回だけ実行されるようにします insert(slot)
                ハンドラコンポーネント()
              }
              ;(slot.data.hook || {}).postpatch = handlerComponent
            }).call(this, スロット)
          }
        }
        (スロット&& slot.elm && slot.elm.nodeType === 3)の場合{
          if (this.showSpin) {
            slot.memorizedtextContent = slot.elm.textContent
            slot.elm.textContent = ''
          } それ以外 {
            slot.elm.textContent = slot.memorizedtextContent || slot.elm.textContent || slot.text
          }
        }
        children && this.handlerPrefix(children, handler, false)
      })
    },

ステップバイステップの分析:

  1. スロットを反復処理する
  2. 次のループのために現在のvnodeの下の子コレクションを取得します。
  3. ネイティブHTML要素かどうかを判断します。コンポーネントvnodeのみがcomponentOptions属性を持ちます。
  4. 抽象コンポーネントかどうかを判断します。キープアライブやトランジションなどの抽象コンポーネントは、実際のDOMTreeにレンダリングされないことがわかっています。各コンポーネントのvnodeには、init、insert、prepatch、destroyという独自のフックライフサイクルがあります。各ライフサイクルは、さまざまな段階でトリガーされます。挿入をハイジャックし、元の挿入メソッドを保持してから、vnodeの挿入メソッドを再構築して、handlerComponentメソッドを呼び出してクラス名を追加します。これは、上記のマウントされたnextTickの使用概念に似ています。handlerComponentは子コンポーネントのインスタンスを知る必要があるため、インスタンス化後に呼び出す必要があります。コンポーネントのinitメソッドは、コンポーネントをインスタンス化し、watcher.update(watcher.render())を直接呼び出します。つまり、挿入メソッドを呼び出すと、実際にはupdate(render())の後であるため、インスタンス化された子コンポーネントをここで取得できます。
  5. nodeType がテキスト ノードかどうかを判断します。テキスト ノードである場合は、textContent を保存してから削除し、スケルトン画面が表示されたときにデフォルトのテキストが表示されないようにします。スケルトン画面が消えたら、以前に保持したデフォルトのテキストを vnode に戻します。これにより、スケルトン画面の表示と非表示を自由に切り替えることができます。

vnodeを操作するための静的クラス名

    addSkeletPrefix(スロット) {
      const rootVnode = slot.componentOptions ? (slot.componentInstance || {})._vnode || {} : スロット;
      (ルートノード.elm)の場合{
        rootVnode.elm.classList.add(this.skeletPrefix)
      } それ以外 {
        ;(rootVnode.data || {}).staticClass += ` ${this.skeletPrefix}`
      }
    },
    スケルトンプレフィックスを削除します(スロット) {
      const rootVnode = slot.componentOptions ? (slot.componentInstance || {})._vnode || {} : スロット;
      (ルートノード.elm)の場合{
        rootVnode.elm.classList && rootVnode.elm.classList.remove(this.skeletPrefix)
      } そうでない場合 (rootVnode.data.staticClass) {
        rootVnode.data.staticClass = rootVnode.data.staticClass.replace(` ${this.skeletPrefix}`, '')
      }
    }

addSkeletePrefixはgm-skeletonクラス名を追加するために使用され、removeSkeletonPrefixはgm-skeletonクラス名を削除するために使用されます。

使い方

  'vue' から Vue をインポートします
  'path/to/GMSkeleton' から GMSkeleton をインポートします
  
  Vue.use(GMSkeleton)
  <gm-スケルトン>
    <コンポーネント />
    <div></div>
    <div><span>フロントエンド マーティン</span></div>
  </gm-スケルトン>

値の受け渡し

物件名価値説明する
スピンを表示ブールスケルトン画面を開くかどうか。デフォルトはtrueです。
スケルトンプレフィックススケルトンスクリーンクラス名。デフォルトは gm-skeleton です。

効果は以下のとおりです

特定のスタイルは、開発者が書いたスタイルに従って生成され、上記のようにgm-skeletonでラップされます。以下は簡単な例です。

完全な住所

Vue スケルトン スクリーンを実装するための 80 行のコード

以上がvueでスケルトン画面を実装した例の詳細です。vueでスケルトン画面を実装する方法の詳細については、123WORDPRESS.COMの他の関連記事にも注目してください!

以下もご興味があるかもしれません:
  • Vueプロジェクトのスケルトンスクリーンインジェクションの実践についての簡単な説明
  • vue-skeleton-webpack-plugin に基づくスケルトン スクリーンの練習
  • Vueモバイル端末にスケルトン画面を注入する設定方法
  • VUEシングルページアプリケーションスケルトンスクリーンソリューションの詳細な説明
  • vue-cli を使用してスケルトン スクリーンを構築する方法の例
  • Vueページのスケルトン画面の実装方法
  • Vue ページ スケルトン スクリーン インジェクション メソッド
  • Vueシングルページスケルトン画面実践記録について

<<:  MySQL 5.7.20 の解凍バージョンをインストールするための詳細な手順 (2 つの方法)

>>:  Linux で Scala 環境を構築し、簡単な Scala プログラムを書く

推薦する

元のPATHを上書きしてコマンドが見つからないというメッセージが表示されるコマンド失敗の問題を解決する方法

同僚から、LINUX サーバー上の多くのコマンドが (コマンドが見つかりません) というプロンプトで...

Linux の who コマンド例の紹介

誰についてシステムにログインしているユーザーを表示します。 who コマンドを実行すると、現在システ...

nestjs からフロントエンドに返されるデータ形式のカプセル化実装

通常、開発プロセスでは、インターフェイス要求の成功または失敗は httpcode に基づいて決定され...

js で 0ms 遅延タイマーを実装するいくつかの方法

目次キューマイクロタスク非同期/待機メッセージチャネルやっと付録ここ二日間、「タイムリーな setT...

HTMLテーブルタグの詳しい解説(初心者向け)

表> <TR> <TD> <TH> <キャプション&...

CSS中級者向けアダプティブレイアウトの5つのソリューションの詳細な説明

序文ページを作っていく上で、ページレイアウトに関する内容に遭遇することが多く、面接でも聞かれることも...

スタイル属性 (element.style) で定義されたインライン スタイルを削除する方法

Magento を頻繁に変更する場合、element.style に遭遇することがあります。 これは...

JavaScript で文字列を数値に変換する方法

目次1.parseInt(文字列、基数) 2. 数値() 3.parseFloat()主なメソッドは...

Python 仮想環境のインストールとアンインストールの方法と発生する問題

Ubuntu16.04 のインストールとアンインストール pip実験環境Ubuntu 16.04; ...

Linux lsof コマンドの使用方法の詳細な説明

lsof (開いているファイルのリスト) は、プロセスによって開かれたファイルを表示するツールです。...

MySQLのスペースをクリーンアップするいくつかの具体的な方法

目次序文1. ファイルのディスク使用量を確認する1.1 ディスク容量の使用状況を確認する1.2 ディ...

さまざまな解像度やブラウザでウェブページを適切に表示する方法

キーコードは次のとおりです。コードをコピーコードは次のとおりです。 html{高さ:100%; }コ...

Apache ab を使用して HTTP パフォーマンス テストを実行する

MacにはApache環境が付属していますターミナルを開き、sudo apachectl -v と入...

HTML ul および li タグを使用して画像を表示するサンプル コード

以下のコードをDreamweaverのコードエリアにコピーすると、プレビュー時に以下の画像が表示され...

Vue2.x プロジェクトのパフォーマンス最適化のためのコード最適化の実装

目次1 v-ifとv-showの使用2. 計算と監視を区別する3 v-for トラバーサルでは、アイ...