Blazor WebAssembly
Blazor WebAssemblyはWebAssemblyによって.NET環境がブラウザに用意されC#で書いたコードがそのまま動いちゃうすごいやつです。そしてきちんとSPAフレームワークになっているのですがDOMとモデルの双方向バインディングで少しハマったので記録として残しておきます。
Blazor WebAssemblyは、.NETとC#などを用いてWebブラウザ上で実行可能なWebアプリケーションを開発できるフレームワークおよび実行系です。
Blazor WebAssembly 3.2.0はBlazor WebAssemblyとしてフル機能が実装され、本番運用に対応したバージョンです。これによりBlazor WebAssemblyは正式版としてリリースされたことになります。
要件
下記のようなinput
タグの値を変えたら、リアルタイムでh2
タグのインナーテキストも変更させることが要件です。
<h2>@name</h2>
<input type="text" />
NG実装
双方向バンディングの@bind
を使ってみます。
<h2>@name</h2>
<input type="text" @bind="name" />
@code {
string name = "";
}
上記では双方向にバインドできていますが、フォーカスが離れたり、エンターを押したりしないと反映されません。
OK実装①
@bind-value
で双方向バインディングしつつ、@bind-value:event
でインプットイベント拾います。
<h2>@name</h2>
<input type="text" @bind-value="name" @bind-value:event="oninput" />
@code {
string name = "";
}
フォーカスアウトやエンター入力で発生する@bind
異なり、テキストボックスの値が変更されたときにイベントが発生します。
単純な実装でコード量が少ないです。
OK実装②
@oninput
で入力時に実行されるメソッドをバンディングします。
バインドしたメソッド内でname
の値を書き換えて画面に反映します。
値の変更だけでなく、何かしら処理をしたい場合に使います。
<h2>@name</h2>
<input type="text" value="@name" @oninput="HandleInput" />
@code {
string name = "";
void HandleInput(ChangeEventArgs e)
{
// メソッド内でなにか処理をできる
name = e.Value.ToString();
}
}
おまけ
@bind
は下記のように@onchange
を使ったコードに内部的に変換されるらしく、
1つの要素に対して@bind
と@onchange
を同時に使用することはできないようです。
<input @bind="CurrentValue" />
<input type="text" value="@CurrentValue"
@onchange="@((ChangeEventArgs __e) => CurrentValue = __e.Value.ToString())" />