Lightning Blog
Blazor記事イメージ画像

【Blazor】 属性スプラッティングの使い方

更新日:2023/07/19

この記事では属性スプラッティングについて解説します。

属性スプラッティングは、複数の属性(class,styleなど)を一度にコンポーネントに適用することができる便利な機能です。 これを利用すると、コードの無駄が無くなり、コードの再利用性を高めることができます。

    目次

  • 基本的な使用方法
  • 非文字列型の属性値
  • 注意点
  • 属性スプラッティングを使ったコンポーネント
  • まとめ

基本的な使用方法

セクション画像

早速ですが、属性スプラッティングを使用して、ボタンの属性を一括設定してみます。


    @* ボタンに属性スプラッティングを使用する例 *@

    @page "/attributebutton"

    <button @attributes="buttonAttributes">属性スプラッティング</button>

    @code {

        private IDictionary<string, object> buttonAttributes;

        protected override void OnInitialized()
        {
            // 属性スプラッティングを使用してボタンのスタイルを設定
            buttonAttributes = new Dictionary<string, object>
            {
                { "class", "btn btn-primary" },
                { "style", "font-size: 16px; font-weight: bold;" },
                { "onclick", EventCallback.Factory.Create(this, OnButtonClick) }
            };
        }

        private void OnButtonClick()
        {
            // ボタンがクリックされたときの処理
            // ここに適当な処理を記述
            Console.WriteLine("ボタンがクリックされた!");
        }

    }

button要素に@attributesを使用して、属性スプラッティングを行っています。 @attributesに渡す値は、IDictionary<string, object>型である必要があります。

buttonAttributesは、ボタンの属性と値のペアを格納しています。 このbuttonAttributesを渡すことで、class属性やstyle属性、onclick属性をまとめて設定することができます。

それでは実行してみましょう。 ボタンに属性が適用され、ボタンの見た目が変わっていることがわかります。

実行結果
実行結果

非文字列型の属性値

セクション画像

属性スプラッティングでは、非文字列型の属性値も扱うことができるようになっています。 例えば、disabled属性を動的に設定することが可能です。


@code {
    private Dictionary<string, object> buttonAttributes = new Dictionary<string, object>
    {
        { "class", "btn btn-primary" },
        { "disabled", true }
    };
}

<button @attributes="buttonAttributes">I am disabled</button>

注意点

セクション画像

属性スプラッティングで適用される属性は、明示的に定義された属性よりも優先度が低いです。


<button class="btn btn-primary" @attributes="buttonAttributes">属性スプラッティング</button>

@code {

    private Dictionary<string, object> buttonAttributes = new Dictionary<string, object>
    {
        { "class", "btn btn-secondary" }
    };

}

上の例では、buttonに明示的にbtn btn-primaryというclassが設定されているため、 buttonAttributesbtn btn-secondaryは無視されてしまいます。

属性スプラッティングは便利ですが、こういった罠もあるので、気を付けましょう。


属性スプラッティングを使ったコンポーネント

セクション画像

属性スプラッティングを使ったコンポーネントを作成することもできます。


    @* 属性スプラッティングを使用したコンポーネント *@

    <input placeholder="@PlaceHolder" @attributes=InputAttributes />

    @code {

        [Parameter]
        public string? PlaceHolder{ get; set; }

        /// <summary>
        /// 属性スプラッティングで受け取るパラメータ
        /// </summary>
        [Parameter(CaptureUnmatchedValues = true)]
        public Dictionary<string, object>? InputAttributes { get; set; }

    }

通常のパラメータ通り、Parameter属性を付与しますが、注意点が2つあります。

  • Dictionary<string,object>の型にする
  • [Parameter]CaptureUnmatchedValues = trueを指定する

作成したコンポーネントをページ内での使用例を見ていきましょう。 以下は実際にコンポーネントを使用したコードになります。


    @* 属性スプラッティングのコンポーネントを使用したページ *@

    @page "/attributecomponent"

    <Blazor_AttributeSplatting.Components.AttributeSplattingComponent InputAttributes="Attributes" 
                                                                      PlaceHolder="何か入力してください。" />

    @code {

        private Dictionary<string, object> Attributes { get; set; } = new()
        {
            { "type","password" }
        };

    }

このページでは、コンポーネントの入力タイプをpasswordへ変更してみます。 使い方は、ボタンの例と同様に、Dictionary<string,object>の型でパラメータを渡すだけです。

それでは実行してみます。

実行結果
実行結果

入力部分がパスワードになっていることが確認できます。


まとめ

セクション画像
Blazorにおける属性スプラッティングは、コンポーネントの柔軟性と再利用性を高める便利な機能ですが、 明示的に設定された属性が優先される点には注意してください。
ブログ内の記事で書かれているサンプルコードは、GitHubから確認する事ができます。 是非参考にしてみてください。

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

合わせて読みたい

カード画像
@をエスケープする方法

Blazorにおいて、@記号は予約文字として扱われるため、文字列として表示する際にはエスケープが必要です。@をエスケープして表示するためには、@を2回連続して書くことで実現できます。この技術は、一般的なケースではあまり使用されないかもしれませんが、知っておくと便利な場面もあるでしょう。

更新日:2023/07/20

カード画像
@refを使い方

Blazorの@refを用いてコンポーネント内のデータやメソッドにアクセスする方法を詳解。@refはBlazorコンポーネント参照のためのディレクティブで、親から子コンポーネントのメソッドやプロパティを操作できる。具体的な使用シナリオとしてフォームバリデーションやモーダルダイアログが挙げられるが、レンダリング後の使用や過度な依存を避けることが推奨される。

更新日:2023/09/05

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