【Blazor】 @refを使い方
- @refとは?
- 参照されるコンポーネントを作成
- 作成したコンポーネントを参照する
- 実用的なシナリオ
- 注意点
目次
@refとは?

@refとはBlazorコンポーネントの参照するためのディレクティブのことです。 これを使用することで、親コンポーネントから子コンポーネントのメソッドを呼び出したり、プロパティを変更することができるようになります。
参照されるコンポーネントを作成

まず、参照するための子コンポーネントを作成していきます。 親コンポーネントからUpdateMessageメソッドが呼ばれると、UIのテキストが引数の値に変更される仕組みになっています。
<h3>@Message</h3>
@code {
public string Message { get; set; } = "初期メッセージ";
public void UpdateMessage(string newMessage)
{
Message = newMessage;
// 状態変更後、コンポーネントの再レンダリングをトリガーします
StateHasChanged();
}
}
作成したコンポーネントを参照する

前セクションで作成したコンポーネント(ChildComponent)を使って、コンポーネントを参照します。 以下コード例になります。
@page "/parent"
@using Blazor_Ref.Components;
<ChildComponent @ref="childRef" />
<button @onclick="UpdateChildMessage">子コンポーネントのメッセージを更新</button>
@code {
private ChildComponent? childRef;
private void UpdateChildMessage()
{
childRef?.UpdateMessage("ボタンによるメッセージ更新");
}
}
親コンポーネント内で子コンポーネントであるChildComponentを@refを用いて参照します。 @refには、コンポーネントの変数であるchildRefを指定します。そうすることで、値が共有されます。 ボタンを押したタイミングで、参照した子コンポーネントからUpdateMessageメソッドを呼び出しています。 ボタンをクリックし、メッセージが初期メッセージからボタンによるメッセージ更新へ変更されることを確認してください。
実用的なシナリオ

様々な場面で活用することができますが、次の場面がよく使われそうな気がします。
- フォームのバリデーション
- モーダルダイアログ
注意点

@refで参照したコンポーネントがレンダリングが完了してから、使用するようにしてください。 注意が必要なのは、以下のようなコードです。
@page "/parent"
@using Blazor_Ref.Components;
<ChildComponent @ref="childRef" />
@code {
private ChildComponent? childRef;
protected override void OnInitialized()
{
// 初期化時 childRef はまだ null になっている
childRef.UpdateMessage("新しいメッセージ");
}
protected override void OnAfterRender(bool firstRender)
{
if (firstRender)
{
// OnAfterRenderはレンダリング後の処理なので childRef は null ではありません。
childRef?.UpdateMessage("レンダリング後の更新メッセージ");
}
}
}
OnInitializedメソッドなどの初期化処理などで、レンダリングされていない状態だとnull参照になります。 それに比べて、OnAfterRenderはレンダリング後に行う処理のため、null参照にはなりません。 もし参照したコンポーネントで初期化等が必要な場合は、OnAfterRenderで行うようにします。
@refは便利ですが、使用は最低限に抑え、ロジックはなるべくコンポーネント内で完結するように心がけると、 バグの少ないアプリケーションになると思います。
この本では、Blazorの基本から高度なテクニックまで、実際のプロジェクトに役立つ知識を網羅しています。 初心者から経験者まで、Blazorを扱うすべての開発者にとっての必読書です。 この記事の執筆者も参考にした「Blazor入門」で、あなたのBlazorスキルを飛躍的に向上させませんか?
合わせて読みたい

属性スプラッティングの使い方
Blazorの属性スプラッティング機能は、コンポーネントに複数の属性を一括で適用し、コードの再利用性を向上させるための手段です。基本的には、@attributesを使用し、属性と値のペアを格納したIDictionary<string, object>型を渡します。非文字列型の属性値もサポートしており、コンポーネントでも属性スプラッティングが利用可能です。ただし、属性の優先度に注意が必要です。これにより、Blazorアプリケーションの開発効率と柔軟性が向上します。
更新日:2023/07/19

JavaScriptを呼び出し方
BlazorでWEB開発は主にHTML, CSS, C#を使用しますが、JavaScriptの利用も避けられない場面がある。JavaScriptをBlazor内で呼び出すためには、IJSRuntimeサービスを利用する。IJSRuntimeを用いることで、C#からJavaScriptの関数を非同期的に実行可能。例として、ボタンクリックでJavaScriptのアラートを表示する方法を説明。BlazorでのJavaScript使用は最小限に留めるべきだが、必要な場面での知識は重要。
更新日:2023/07/19