Razor のコンポーネント

完了

開発環境の設定が完了したので、Blazor プロジェクトの構造を詳しく見ていくとともに、Blazor コンポーネントの仕組みを学習しましょう。

ホームページ

アプリのホーム ページは、Components/Pages ディレクトリ内にある Home.razor ファイルによって定義されます。 Home.razor には次のコードが含まれます。

@page "/"

<PageTitle>Home</PageTitle>

<h1>Hello, world!</h1>

Welcome to your new app.

一番上の @page ディレクティブはこのページのルートを指定しており、ユーザーがアプリのルートに移動したときには Home コンポーネントが表示されます。 PageTitle タグは現在のページのタイトルを設定する Blazor コンポーネントで、このタイトルがブラウザー タブに表示されます。ファイルの残りの部分は通常の HTML で、ページのコンテンツを定義します。

Razor とは

Razor は、HTML と C# に基づいたマークアップ構文です。 Razor ファイル (.razor) にはプレーンな HTML のほか、条件付き、制御フロー、式の評価などの、レンダリング ロジックを定義する C# が含まれます。 その後、Razor ファイルは、コンポーネントのレンダリング ロジックをカプセル化する C# クラスにコンパイルされます。

Razor コンポーネントとは

Blazor プロジェクト内のファイルを詳しく見てみると、プロジェクトを構成するファイルのほとんどが .razor ファイルであることがわかります。 Blazor では、Razor ファイルが、アプリ UI の一部を構成する再利用可能なコンポーネントを定義しています。 コンポーネントは、レンダリングする HTML およびユーザー イベントの処理方法を定義します。

コンパイル時に、各 Razor コンポーネントは C# クラスに組み込まれます。 クラスには、状態、レンダリング ロジック、ライフサイクル メソッド、イベント ハンドラーなどの一般的な UI 要素を含むことができます。 Razor で作成された Blazor コンポーネントは単なる C# クラスなので、コンポーネントから任意の .NET コードを使用できます。

コンポーネントの使用

別のコンポーネントのコンポーネントを使用するには、そのコンポーネント名と一致する名前を持つ HTML スタイルのタグを追加します。 たとえば、MyButton.razor という名前のコンポーネントがある場合、<MyButton /> タグを追加することで、MyButton コンポーネントを別のコンポーネントに追加できます。

コンポーネントのパラメーター

コンポーネントにはパラメータを含めることもできます。そうすることで、パラメータを使用して、コンポーネントにデータを渡すことができます。 コンポーネントのパラメータは、public の C# プロパティを [Parameter] 属性を持つコンポーネントに追加することで定義します。 その後、プロパティ名と一致する HTML スタイルの属性を使って、コンポーネントのパラメータの値を指定できます。 パラメータの値には、任意の C# 式を指定できます。

@code ブロック

Razor ファイルの @code ブロックを使用して、C# クラス メンバー (フィールド、プロパティ、メソッド) をコンポーネントに追加します。 @code を使用して、コンポーネントの状態の追跡、コンポーネント パラメータの追加、コンポーネント ライフサイクル イベントの実装、イベント ハンドラーの定義を行えます。

カウンターを試す

実行中のアプリで、左側のサイドバーの [カウンター] タブをクリックして、[カウンター] ページに移動します。 次のページが表示されます。

Counter Screenshot.

[クリックしてください] ボタンを選択して、ページを更新せずにカウンターを増分します。 Web ページでカウンターを増分するには、通常、JavaScript を記述する必要がありますが、Blazor では C# を使用できます。

Counter コンポーネントの実装は、Components/Pages/Counter.razor で確認できます。

@page "/counter"
@rendermode InteractiveServer

<PageTitle>Counter</PageTitle>

<h1>Counter</h1>

<p role="status">Current count: @currentCount</p>

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>

@code {
    private int currentCount = 0;

    private void IncrementCount()
    {
        currentCount++;
    }
}

ブラウザーで /counter の要求があると、上部の @page ディレクティブで指定されているように、Counter コンポーネントによってそのコンテンツがレンダリングされます。 @rendermode ディレクティブはコンポーネントの対話型サーバー レンダリングを有効にし、ブラウザーからユーザー インターフェイス イベントを処理できるようにします。

[Click me] (ここをクリック) ボタンを選ぶたび:

  • onclick イベントが発生します。
  • IncrementCount メソッドが呼び出されます。
  • currentCount がインクリメントされます。
  • コンポーネントがレンダリングされ、更新されたカウントが表示されます。