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

完了

このピザ会社は、注文できるサイズが 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;
    

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

  4. [データ] を展開して、SeedData.cs を選びます。

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

    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.dbpizza.db-shmpizza.db-wal の各ファイルを選んで削除します。

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

  8. アプリで、新しい Margherita Family Size ピザを選びます。

    Screenshot of the new family size pizza.

  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. ファミリ サイズのピザを追加し、レンダリングから省略されているため、サイズ スライダーが無効になることを確認します。

    Screenshot of the new family size pizza with the size range omitted from rendering.

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

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