実際のプロジェクトで遭遇する要件同じリンクで異なるページ コンポーネントを読み込む必要があります。ユーザーが購入したサービスに応じて異なるページが表示されます。 実装が間違っているところもある
私は個人的に、実装するより良い方法はルートが設定されているサーバーデータを取得し、対応するコンポーネントを動的にロードします。 { パス: '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) の解決方法
WeChat ミニプログラム - QR コード ジェネレーターダウンロード: weapp-qrcod...
目次まず、package.jsonを設定します次にwebpackツールをインストールしますwebpa...
1. 基本的な使い方 <!DOCTYPE html> <html lang=&qu...
SASS で定義された変数では、後で設定された値によって古い値が上書きされます。 $色: 赤; $色...
ファイアウォールファイアウォールは一連のルールです。パケットが保護されたネットワーク空間に出入りする...
目次1. スローログの紹介2. スローログの練習1. スローログの紹介スロー ログの正式名称はスロー...
Linux では、アプリケーションをダウンロードしてインストールすると、起動時にアプリケーション名...
Web ページのスタイル設定に関しては、プロジェクトで純粋な CSS または SCSS (および他...
HTML 中心のフロントエンド開発は、ほぼ Web 標準の意味です。共通しているのは「分離」という考...
目次導入クロージャの使用カレー作りパブリック変数の実装キャッシュカプセル化(属性のプライベート化)閉...
最近では、特定のフォルダ内の特定のファイルを自動的に検索する必要があり、ファイルパスとファイル名を別...
導入js コード文の末尾にセミコロンを追加しても追加しなくても問題ありません。一般的に、チームで開発...
目次オブザーバーパターンVue パス値最初のステップは、main.jsにバスを登録することです。 2...
MySQLインストールチュートリアル、参考までに具体的な内容は次のとおりです。 1. ダウンロードY...
目次ブートオプションコマンドラインパラメータの長い形式と短い形式設定ファイル構成グループシステム変数...