Lightning Blog
Blazor記事イメージ画像

【Blazor】 @refを使い方

更新日:2023/09/05
Blazorでは@refを使用することで、Component内を参照し、データやメソッドにアクセスすることができるようになります。 この記事では、@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は便利ですが、使用は最低限に抑え、ロジックはなるべくコンポーネント内で完結するように心がけると、 バグの少ないアプリケーションになると思います。


ブログ内の記事で書かれているサンプルコードは、GitHubから確認する事ができます。 是非参考にしてみてください。

この本では、Blazorの基本から高度なテクニックまで、実際のプロジェクトに役立つ知識を網羅しています。 初心者から経験者まで、Blazorを扱うすべての開発者にとっての必読書です。 この記事の執筆者も参考にした「Blazor入門」で、あなたのBlazorスキルを飛躍的に向上させませんか?

合わせて読みたい

カード画像
クエリ文字列を操作する方法

BlazorでURIのクエリ文字列を効果的に処理する方法を紹介。主に、Microsoft.AspNetCore.WebUtilitiesライブラリを活用することで、HTTP関連の操作が容易になる。具体的な実装として、counterページの初期カウント数をクエリ文字列から取得する例を提供。ページ初期化時にNavigationManagerサービスを使用してURIを取得し、WebUtilitiesでクエリを解析して必要な値を取得する手法を示す。

更新日:2023/07/19

カード画像
DOMイベント一覧

この記事では、Blazorで使用可能なDOMイベントに関する包括的なガイドを提供しています。DOM(Document Object Model)はウェブページの内容や構造を表現するための仕組みであり、Blazorを用いることで、さまざまなDOMイベントを効果的に扱うことが可能です。記事は、onabortからonwheelまで、様々なイベントの名前と発生条件を詳細な表形式で紹介しています。これにより、Blazor開発者は適切なイベントを状況に応じて選択し、ウェブページのインタラクティビティを高めることができます。

更新日:2023/09/03

An error has occurred. This application may no longer respond until reloaded. Reload 🗙