実際のプロジェクトで遭遇する要件同じリンクで異なるページ コンポーネントを読み込む必要があります。ユーザーが購入したサービスに応じて異なるページが表示されます。 実装が間違っているところもある
私は個人的に、実装するより良い方法はルートが設定されているサーバーデータを取得し、対応するコンポーネントを動的にロードします。 { パス: '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を抽象化して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 のみサポート) これで、Vue Router がバックグラウンド データに応じて異なるコンポーネントをロードする方法についての説明は終わりです。Vue Router がバックグラウンド データに応じて異なるコンポーネントをロードする方法についての詳細は、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: MySQL 5.7 でパスワードを変更するときに発生する ERROR 1054 (42S22) の解決方法
>>: MySQL サーバー ログイン エラー ERROR 1820 (HY000) の解決方法
仮想環境で pip 経由でインストールしてみてください: pip で mysqlclient をイン...
目次1. データベースのボトルネック2. サブライブラリとサブテーブル2. 横長テーブル3. 垂直サ...
目次前提条件テストページの設定書き換えルールの作成命名規則モードの定義アクションの定義設定ファイル内...
mysql5.7.17のインストールチュートリアルを参考までに共有します。具体的な内容は次のとおりで...
目次テーブルの目的例えばテーブル分割戦略すでにオンラインになっている実行中のテーブルはどうすればよい...
早速ですが、デモ画像をご紹介します。実装されている機能は、左側に凡例、右側にウォーターフォール チャ...
コンテナの起動コマンドを取得する方法コンテナはすでに作成されていますが、その起動パラメータ(データが...
トムキャット公式サイトtomcatはローカルサーバーと同等であり、Webページを開くことができます設...
基本的な概念: Macvlanの動作原理: Macvlan は、Linux カーネルでサポートされて...
サーバーに複数のサイトを展開するには、異なるサイトにアクセスするために複数のポートを開く必要がありま...
目次1. 通常の機能2. 矢印関数3. データパケットJSON 4. オブジェクト5. 約束6. 非...
来学期にMySQLを勉強します。事前に自宅で練習していませんでした。インストールに時間がかかるとは思...
目次1. コンパイラコードフォーマット仕様設定2. Vueテンプレートの設定1. コンパイラコードフ...
MySQL はネストされたトランザクションをサポートしていますが、それを実行する人は多くありません....
目次背景インスピレーションは人生から生まれる速達配送の最適化原則GaussDB の最適化 (MySQ...