演習 - ライフサイクル イベントを使用してアプリの対話機能を改善する

完了

ピザ会社は、1つの24インチサイズでのみ利用可能な特別なファミリーサイズのピザを販売したいと決めました。 現在のピザ アプリのサイズ スライダーは、サイズが 1 つのピザには対応していません。 あなたは、新しいファミリ サイズ ピザを追加し、そのピザについてはサイズ オプションを無効にするよう求められました。

この演習では、ピザ データベースを変更してファミリ サイズのピザを追加し、新しいピザに対応するようにピザ モデルを変更します。 Blazor コンポーネントのライフサイクル イベントを処理するために、固定サイズのケースを扱えるようにピザを構成するダイアログに変更を加えます。

新しいファミリ サイズのピザを作成する

最初に、新しい FixedSize 機能をピザ モデルに追加し、ピザ データベースに新しいファミリ サイズ ピザを作成します。

  1. Visual Studio Code エクスプローラーで、[ モデル ] を展開し、[ PizzaSpecial.cs] を選択します。

  2. PizzaSpecial.cs ファイルで、ImageUrl プロパティの後に、次の新しいプロパティを追加します。

    public int? FixedSize { get; set; }
    
  3. Pizza.cs ファイルを開き、GetBasePrice メソッドを次のコードに置き換えます。

    public decimal GetBasePrice() =>
        Special is { FixedSize: not null }
            ? Special.BasePrice
            : (decimal)Size / DefaultSize * Special?.BasePrice ?? 1;
    

    このコードでは、FixedSize を返すときに、BasePrice であるスペシャルが考慮されるようになります。

  4. データ を展開し、SeedData.cs を選択します。

  5. SeedData.cs ファイルで、新しいファミリ サイズピザの次のコードを、specials メソッドのInitializeAsync配列宣言の末尾に追加します。

    new()
    {
        Id = 9,
        Name = "Margherita Family Size",
        Description = "24\" of pure tomatoes and basil",
        BasePrice = 14.99m,
        ImageUrl = "img/pizzas/margherita.jpg",
        FixedSize = 24
    }
    
  6. SeedData クラスは、スペシャル ピザをピザ データベースに事前に設定します。 新しい PizzaSpecial を作成するには、既存のデータベースを削除する必要があります。 エクスプローラーで、pizza.db、pizza.db-shmおよび pizza.db-wal ファイルを選択して削除します。

  7. Visual Studio Code で F5キーを押 すか、実行>デバッグの開始を選択します。

  8. アプリで、新しい マルゲリータファミリーサイズ のピザを選択します。

    新しいファミリー サイズのピザのスクリーンショット。

  9. 注文フォームで、まだピザのサイズを変更できることに注意してください。

  10. Shift+F5 キーを押すか、[実行>ストップ デバッグ] を選択してアプリを停止します。

サイズ スライダーを削除する

ConfigurePizzaDialog コンポーネントでは、HTML の range 要素を使って、顧客がピザのサイズを選択できるようにしています。 ユーザー入力を無効にする方法の 1 つは、条件に応じてサイズ ユーザー コントロールのレンダリングをそっくり省略することです。

  1. Visual Studio Code エクスプローラーで、[ 共有 ] を展開し、[ ConfigurePizzaDialog.razor] を選択します。

  2. @code ディレクティブで、既存のプロパティの後に、次のメンバーを追加します。

    bool supportSizing = true;
    
    protected override void OnInitialized()
    {
        if (Pizza is { Special.FixedSize: not null })
        {
            Pizza.Size = Pizza.Special.FixedSize.Value;
            supportSizing = false;
        }
    }
    

    supportSizing フィールドの既定値は true ですが、ピザが固定サイズの場合は、そのフィールドを false に設定します。 OnInitialized ライフサイクル メソッドのオーバーライドにより、ピザのサイズが固定サイズに設定されて、サイズ変更のサポートが無効になります。

    Note

    コードが JavaScript の相互運用に依存していた場合、OnInitialized メソッドは動作しなくなります。 代わりに、OnAfterRenderAsync メソッドを使って、JavaScript の相互運用を確実に使用できるようにする必要があります。

  3. ファイルの先頭近くにある <form class="dialog-body"> で、既存の labelinput の行を次のコードに置き換えます。

    @if (supportSizing)
    {
        <label>Size:</label>
        <input type="range" min="@Pizza.MinimumSize" max="@Pizza.MaximumSize"
            step="1" @bind="Pizza.Size" @bind:event="oninput" />
    }
    
  4. F5 キーを押すか、実行>デバッグの開始を選択します。

  5. ファミリー サイズのピザを追加し、サイズ スライダーがレンダリングされないため無効になっていることを確認します。

    サイズ範囲がレンダリングから省略された新しいファミリー サイズ ピザのスクリーンショット。

  6. 別のピザを注文し、そのピザでは前と同じようにサイズ スライダーを使用できることを確認します。

  7. Shift+F5 キーを押すか、[実行>ストップ デバッグ] を選択してアプリを停止します。