0Pricing
C# Academy · レッスン

Blazorコンポーネントモデル

Razorコンポーネントを作成し、コンポーネントのライフサイクルを理解して、パラメーターとカスケーディング値を使います。

「Blazorコンポーネントモデル」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

Blazor とは

Blazor を使うと、JavaScript の代わりに C# でインタラクティブな Web UI を構築できます。コンポーネントは、HTML マークアップと C# ロジックを組み合わせた .razor ファイルで定義します。Blazor はサーバー上(Blazor Server)で実行することも、WebAssembly(Blazor WASM)を介してブラウザー内で実行することもできます。

最初のコンポーネント

Razor コンポーネントは、HTML マークアップと C# 用の @code ブロックを含む .razor ファイルです。コンポーネント名が HTML タグ名になります。

@* Greeting.razor *@
<h2>Hello, @Name!</h2>
<p>You have @Count messages.</p>

@code {
    [Parameter] public string Name { get; set; } = "World";
    private int Count = 5;
}

コンポーネントのライフサイクル

Blazor コンポーネントには、オーバーライド可能なフックを備えたライフサイクルがあります。最もよく使われるのは、データの読み込みに使う OnInitializedAsync と、パラメーターの変更への反応に使う OnParametersSetAsync です。

@code {
    private List<Product> Products = new();

    protected override async Task OnInitializedAsync()
    {
        // Called once on first render
        Products = await Http.GetFromJsonAsync<List<Product>>("/api/products")
                   ?? new();
    }

    protected override async Task OnParametersSetAsync()
    {
        // Called whenever parameters change
        await LoadDataAsync();
    }
}

パラメーター:コンポーネントへのデータ受け渡し

プロパティに [Parameter] を付けると、親コンポーネントからデータを受け取れるようになります。パラメーターはレンダリング前に設定され、変更されると再レンダリングを引き起こすことがあります。

@* ProductCard.razor *@
<div class="card">
    <h4>@Product.Name</h4>
    <p>Price: @Product.Price.ToString("C")</p>
    <button @onclick="AddToCart">Add to Cart</button>
</div>

@code {
    [Parameter, EditorRequired]
    public Product Product { get; set; } = default!;

    [Parameter]
    public EventCallback<Product> OnAddToCart { get; set; }

    private async Task AddToCart() =>
        await OnAddToCart.InvokeAsync(Product);
}

カスケードパラメーター

カスケードパラメーターを使うと、すべての中間階層を明示的に経由して渡さなくても、コンポーネントツリーの下位へ値を伝えられます。テーマ、ユーザー情報、共有状態などに適しています。

@* App.razor — wraps the whole app *@
<CascadingValue Value="CurrentUser">
    <Router AppAssembly="@typeof(App).Assembly">
        <Found Context="routeData">
            <RouteView RouteData="routeData" DefaultLayout="@typeof(MainLayout)" />
        </Found>
    </Router>
</CascadingValue>

@* Anywhere in the tree: *@
@code {
    [CascadingParameter]
    public UserInfo CurrentUser { get; set; } = default!;
}

リストと条件分岐のレンダリング

Razor ディレクティブの @if、@foreach、@for を使って、動的なコンテンツをレンダリングします。差分検出を効率化するため、リスト項目には必ず @key を指定してください。

@if (Products.Count == 0)
{
    <p>No products found.</p>
}
else
{
    <ul>
        @foreach (var product in Products)
        {
            <li @key="product.Id">
                <ProductCard Product="product" OnAddToCart="HandleAdd" />
            </li>
        }
    </ul>
}

RenderFragment と ChildContent

RenderFragment を使うと、Vue のスロットや React の children のように、マークアップをパラメーターとして渡せます。慣例的なパラメーター名は ChildContent です。

@* Panel.razor *@
<div class="panel">
    <div class="panel-header">@Title</div>
    <div class="panel-body">@ChildContent</div>
</div>

@code {
    [Parameter] public string Title { get; set; } = "";
    [Parameter] public RenderFragment? ChildContent { get; set; }
}

@* Usage: *@
<Panel Title="Order Details">
    <p>Order #42 — Shipped</p>
</Panel>

@ref によるコンポーネント参照

@ref を使って子コンポーネントへの参照を取得すると、親から子のパブリックメソッドを呼び出したり、プロパティを読み取ったりできます。

@* Parent.razor *@
<ConfirmDialog @ref="_dialog" OnConfirm="DeleteOrder" />
<button @onclick="() => _dialog!.Show()">Delete Order</button>

@code {
    private ConfirmDialog? _dialog;

    private async Task DeleteOrder()
    {
        await OrderService.DeleteAsync(CurrentOrderId);
        // Refresh UI...
    }
}

StateHasChanged と手動での再レンダリング

Blazor はイベントハンドラーの実行後に自動的に再レンダリングします。イベントハンドラーの外部で非同期に状態が変化する場合(バックグラウンドタイマーなど)は、StateHasChanged() を手動で呼び出してください。

@implements IDisposable

<p>Time: @CurrentTime</p>

@code {
    private string CurrentTime = "";
    private Timer? _timer;

    protected override void OnInitialized()
    {
        _timer = new Timer(_ =>
        {
            CurrentTime = DateTime.Now.ToString("HH:mm:ss");
            InvokeAsync(StateHasChanged); // thread-safe re-render
        }, null, 0, 1000);
    }

    public void Dispose() => _timer?.Dispose();
}

パフォーマンス向上のための ShouldRender

ShouldRender() をオーバーライドすると、不要な再レンダリングをスキップできます。コンポーネントの出力が変化しない場合は false を返し、差分検出のオーバーヘッドを削減します。

@code {
    private string _lastRenderedStatus = "";

    [Parameter] public string Status { get; set; } = "";

    protected override bool ShouldRender()
    {
        // Only re-render if Status actually changed
        if (Status == _lastRenderedStatus) return false;
        _lastRenderedStatus = Status;
        return true;
    }
}

実践例:商品一覧コンポーネント

初期化時にデータを読み込み、読み込み状態を処理し、イベントを親へ渡す完全な商品一覧コンポーネントです。

@inject HttpClient Http

@if (_loading)
{
    <p>Loading products...</p>
}
else
{
    @foreach (var p in _products)
    {
        <ProductCard Product="p" OnAddToCart="AddToCart" />
    }
}

@code {
    private List<Product> _products = new();
    private bool _loading = true;

    [Parameter] public EventCallback<Product> OnCartUpdated { get; set; }

    protected override async Task OnInitializedAsync()
    {
        _products = await Http.GetFromJsonAsync<List<Product>>("/api/products")
                   ?? new();
        _loading = false;
    }

    private async Task AddToCart(Product p) => await OnCartUpdated.InvokeAsync(p);
}

確認問題

Blazor コンポーネントの初期化時に API からデータを読み込むには、どのライフサイクルメソッドが最適ですか?

まとめ:Blazor のコンポーネントモデル

主なポイント:

  • .razor ファイルでは、HTML マークアップと @code ブロック内の C# を組み合わせます
  • [Parameter] は親からのデータを受け取り、EventCallback はイベントを親へ渡します
  • CascadingParameter はプロパティのバケツリレーを使わずにデータを下位へ渡します
  • RenderFragment/ChildContent によって、スロットベースで再利用可能なコンポーネントを作成できます
  • 初期データの読み込みには OnInitializedAsync、手動での再レンダリングには StateHasChanged を使用します
  • ShouldRender() によって不要な差分検出をスキップし、パフォーマンスを向上させます

よくある質問

「Blazorコンポーネントモデル」レッスンは無料ですか?

はい。「Blazorコンポーネントモデル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「Blazorコンポーネントモデル」で何を学びますか?

Razorコンポーネントを作成し、コンポーネントのライフサイクルを理解して、パラメーターとカスケーディング値を使います。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Blazorコンポーネントモデル」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Blazorコンポーネントモデル
  2. データバインディングとイベント処理
  3. コンポーネント間通信とDI
  4. Blazorの状態管理
← C# Academyに戻る