Vue Routerはバックグラウンドデータに応じて異なるコンポーネントをロードします

Vue Routerはバックグラウンドデータに応じて異なるコンポーネントをロードします

実際のプロジェクトで遭遇する要件

同じリンクで異なるページ コンポーネントを読み込む必要があります。ユーザーが購入したサービスに応じて異なるページが表示されます。

実装が間違っているところもある

  • これらのコンポーネントを同じコンポーネントの下に記述し、v-if を通じて判断するだけです。こうすれば、vue-router を使う必要すらありません。 1 つのファイルにすべてのコンポーネントを記述し、v-if を使用してすべてを判断できます。 (面倒でも構わないのであれば、コードが何万行もあることが前提です)
  • このリンクをレンダリングするときは、バックグラウンド データを直接要求し、そのデータに基づいて異なるリンクをレンダリングします。 (理論的には可能ですが、ユーザーがこの機能を使用しない場合、これらのリンクは毎回バックグラウンドデータを事前に取得します。また、ユーザーがリンクを知っていて直接リンクにアクセスする場合、ユーザーがどのページを見るべきかを判断するロジックが依然として必要です)
  • router.beforeEach を呼び出すことで、各ルートがインターセプトされます。ルートが指定したルートである場合、バックグラウンド データが要求され、ページが動的にジャンプします。 (機能は完成しますが、実際にはこれはシステム全体のごく一部に過ぎず、ルーティングシステム全体を侵害するものではありません。各業務ページをグローバルルーティングシステムに書き込むと、ルーティングロジックが複雑になりすぎてしまいます。)

私は個人的に、実装するより良い方法は

ルートが設定されているサーバーデータを取得し、対応するコンポーネントを動的にロードします。

{
  パス: 'shopKPI',
  // バックグラウンドデータを事前にストアに保存しておけば、ここでストアデータにアクセスして直接判断できます // ただし、この特定のビジネスページのデータはグローバルストアに配置され、他の場所では使用されないため、実際には不要なコンポーネントです: () => import('@/views/store/dataVersion'),
  名前: 'store_KPI',
  メニュー名: 'ショップコンサルタント',
  メタ: {
    コード: ['storeProduct.detail']
  }
}

理想は素晴らしいですが、現実には、コンポーネントが受信したメソッドは同期的に Promise を返す必要があります。

この時、上記の悪い実装方法1を思い出し、少し修正しました。

<!-- ChooseShopKPI.vue -->
<テンプレート>
  <dataVersion v-if="!useNewShopKPI" />
  <ShopKPI v-else />
</テンプレート>

<スクリプト>
'lodash' から { get } をインポートします。
'@/api/store' から { getStoreReportFormVersion } をインポートします。
'./dataVersion' から dataVersion をインポートします。
'./ShopKPI' から ShopKPI をインポートします。

エクスポートデフォルト{
  名前: 'ChooseShopKPI',

  コンポーネント:
    データバージョン、
    ショップKPI、
  },

  データ() {
    戻り値: {useNewShopKPI: false };
  },

  作成された() {
    getStoreReportFormVersion().then((res) => {
      (res、'data.data.new')を取得する場合){
        this.useNewShopKPI = true;
      }
    });
  },
};
</スクリプト>

<style lang="css" スコープ></style>

ルートレンダリングに対応するページを変更して、この中間ページ ChooseShopKPI をレンダリングします

{
  パス: 'shopKPI',
  // 事前に背景データを取得しておけば、ここでストアデータにアクセスして直接判断できます // ただし、この特定のビジネスページのデータはグローバルストアに配置され、他の場所では使用されないため、実際には不要です - コンポーネント: () => import('@/views/store/dataVersion'),
+ コンポーネント: () => import('@/views/store/ChooseShopKPI'),
  名前: 'store_KPI',
  メニュー名: 'ショップアドバイザー',
  メタ: {
    コード: ['storeProduct.detail']
  }
}

これにより、期待どおりの機能が実現されます。

機能は実現したが、改めて考えてみた

この方法は、ページ コンポーネントを動的に読み込むという問題を非常にうまく解決します。しかし、いくつかの小さな問題も発生しました。

  • 後でサーバー経由でデータを読み込むページが追加されると、複数の ChooseXXX 中間ページが表示されます。
  • この種の中間ページは、実際には二次ルーティングを実行します。ロジックに精通していない開発者は、ここでのページ ジャンプ ロジックを明確に理解できない可能性があり、理解コストが増加します。

最終ソリューション - 高レベルコンポーネント

ChooseXXXを抽象化してDynamicLoadComponentに変換する

<!-- DynamicLoadComponent.vue -->
<テンプレート>
  <コンポーネント:is="comp" />
</テンプレート>

<スクリプト>
エクスポートデフォルト{
  名前: 'DynamicLoadComponent',
  小道具: {
    レンダリングコンポーネント: {
      タイプ: 約束、
    },
  },
  データ() {
    戻る {
      comp: () => this.renderComponent
    }
  },
  マウント() {},
};
</スクリプト>

<style lang="css" スコープ></style>

ルーティング構成でバックグラウンドデータを直接取得し、ルートを配布します。このように、ルーティング ロジックはルーティング構成ファイルに集中しており、セカンダリ ルーティングは存在しません。メンテナンスは面倒ではありません。

DynamicLoadComponent コンポーネントも再利用でき、バックグラウンド データの読み込みページを決定するための後続のルーティング構成をこの中間コンポーネントに送信できます。

{
  パス: 'shopKPI',
  コンポーネント: () => import('@/views/store/components/DynamicLoadComponent'),
  名前: 'store_KPI',
  メニュー名: 'ショップコンサルタント',
  メタ: {
    コード: ['storeProduct:detail'],
  },
  プロパティ: (ルート) => ({
    レンダリングコンポーネント: 新しい Promise((resolve, deny) => {
      getStoreReportFormVersion()
        .then((レスポンスデータ) => {
          レスポンスデータに新しいショップKPI を追加します。
          定数useOldShopKPI = get(
            レスポンスデータ、
            'データ.データ.ストア_データ_表示'
          );

          (新しいショップKPIを使用する場合) {
            解決します(インポート('@/views/store/ShopKPI'));
          } そうでない場合 (OldShopKPI を使用) {
            解決します(インポート('@/views/store/dataVersion'));
          } それ以外 {
            解決します(インポート('@/views/store/ShopKPI/NoKPIService'));
          }
        })
        .catch(拒否);
    })、
  })
}

オンラインサンプルを表示(Chrome のみサポート)
https://stackblitz.com/edit/vuejs-starter-jsefwq?file=index.js

これで、Vue Router がバックグラウンド データに応じて異なるコンポーネントをロードする方法についての説明は終わりです。Vue Router がバックグラウンド データに応じて異なるコンポーネントをロードする方法についての詳細は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • vue-router データの読み込みとキャッシュの使用状況の概要の詳細な説明

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

>>:  MySQL サーバー ログイン エラー ERROR 1820 (HY000) の解決方法

推薦する

Windows 7 環境での Docker 高速ビルドと Alibaba Cloud コンテナ高速化構成の詳細な説明

前回の Docker に関する記事では、MAC システムでの構築について説明しました。この記事では、...

Ansible を使用した Nginx のバッチ デプロイのサンプル コード

1.1 nginxインストールパッケージとインストールスクリプトをクライアントにコピーし、スクリプト...

Linux で Xfce デスクトップ環境を使用すべき 8 つの理由

いくつかの理由(好奇心も含む)から、数週間前に Linux デスクトップとして Xfce を使い始め...

IE8を閲覧するときにウェブサイトが自動的にIE7互換モードを使用するようにする

序文IE の将来のすべてのバージョンで Web ページの外観が一貫していることを保証するために、IE...

SSH経由でローカルLinux仮想マシンに接続するプロセスを記録する

実験環境:物理マシン Windows 10 x64物理NIC情報IPv4 アドレス: 192.168...

Vue px to rem 構成の詳細な説明

目次方法1 1. 構成とインストールの手順:方法2方法3要約する方法1 1. 構成とインストールの手...

Vue でシンプルな無限ループスクロールアニメーションを実装する例

この記事では主に、Vue でシンプルな無限ループスクロールアニメーションを実装し、みんなで共有する例...

Linux の 5 ステップ ビルド カーネル ツリー

目次0. システムに付属するカーネルツリー1. 環境設定最初のステップステップ2 2. ソースコード...

Alibaba Cloud Docker Yum ソースを使用した Docker 17.03.2 の CentOS7 オンラインインストールの詳細説明

参照ドキュメント公式 Docker インストール ドキュメント: https://docs.dock...

テーブルの4辺を上下左右にスクロールするように固定する方法

質問:最近、プロジェクトの統計を行っていたときに、テーブルを上下にスクロールしたときにテーブルの先頭...

要素 UI に基づいてクエリ コンポーネントを段階的にカプセル化する方法

目次関数基本的なクエリ関数クエリ条件の初期化ページのレンダリングクエリと表示の最適化をさらに強化プル...

クリックナンバーゲームを実装するネイティブJS

参考までに、クリックナンバーゲームをネイティブJSで実装しました。具体的な内容は以下のとおりです。最...

XHTML 特殊文字コレクション

注意&#160;ノーブレークスペース = ノーブレークスペース、 iexcl ¡ &...

Webstorm と Chrome を使用して Vue プロジェクトをデバッグする方法

目次序文1. 新しいVueプロジェクトを作成する2. WebStormの設定1. デバッガポートを設...

タグのターゲットリンクを iframe に向ける方法

コードをコピーコードは次のとおりです。 <iframe id="myFrameId&...