実際のプロジェクトで遭遇する要件同じリンクで異なるページ コンポーネントを読み込む必要があります。ユーザーが購入したサービスに応じて異なるページが表示されます。 実装が間違っているところもある
私は個人的に、実装するより良い方法はルートが設定されているサーバーデータを取得し、対応するコンポーネントを動的にロードします。 { パス: '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) の解決方法
目次1. React.FC<> 2. クラスxxはReact.Componentを拡張し...
目次更新可能なビュービューのパフォーマンスビューの制限ビューは MySQL 5.0 以降で導入されま...
目次質問:ケース(1)子スレッドを作成する前にフォークするケース(2)子スレッドを作成した後にフォー...
現在、多くの企業が割引コードを通じてプロモーションを行っています。今では、8桁の割引コードを実装して...
1.fullpage.js ダウンロードアドレスhttps://github.com/alvarot...
glibc は、gnu によってリリースされた libc ライブラリ、つまり c ランタイム ライブ...
導入同社の最近の Vue フロントエンド プロジェクトの要件: ポップアップ ウィンドウのドラッグ、...
次のコードは、私の test.html にあります。ビデオは、c:\test.html などの絶対パ...
nginx プロセス モデルでは、トラフィック統計、トラフィック制御、データ共有などのタスクを完了す...
序文JavaScript では、これは関数呼び出しコンテキストです。この動作が非常に複雑であるからこ...
目次概要コードの実装要約する概要戦略パターンは、JavaScript デザイン パターンにおける動作...
px(ピクセル)ピクセルという言葉は皆さんもよくご存知だと思います。次に、この単位に関するちょっとし...
この記事では、Java接続MySQLの基礎となるカプセル化コードを参考までに紹介します。具体的な内容...
この記事では、Ubuntuサーバーバージョンのインストールグラフィックチュートリアルを参考までに紹介...
日々の運用・保守作業において、MySQL データベースのバックアップは重要です。ウェブサイトにとって...