つい先日、「Kakuge Lounge Finder」というBlazor WebAssemblyで作ったWebアプリを公開しました。
格ゲーでオンラインの対戦相手を募集する際に、希望の対戦相手の条件などをツイートしてTwitter上で募集するという文化があるのですが、このアプリはそのツイート文の生成を補助するアプリです。 アプリでは各フォームに入力したデータをlocalStorageに保存し、次回以降入力しなくて済むようになっています。 今回はBlazorでJavaScriptのlocalStorageまわりの関数を呼び出す方法を書いていきます。
C#からJavaScript関数を呼び出す
C#からJavaScript関数を呼び出すとき、JSRuntimeを使って呼び出します。基本的にはInvokeAsync
@inject IJSRuntime JSRuntime @code { private async ValueTask Save(string key, string value) { var args = new string[] { key, value }; await JSRuntime.InvokeVoidAsync("localStorage.setItem", args); } private async ValueTask<string> Load(string key) { return await JSRuntime.InvokeAsync<string>("localStorage.getItem", key); } }
呼び出し側はこんな感じになります。
<button @onclick="@(async () => await Save("lastSaved", $"{DateTime.Now}"))">Save</button>
そもそも、なんでこんな回りくどいことしてJavaScriptを使うかというと、C#で定義しているViewModelなどのデータをJsonなどにシリアライズしてlocalStorageに保存するため、つまりC#、JavaScript間でデータを連携するためです。普通にlocalStorageを使うだけならbuttonタグのonclickにそのままJavaScriptを書くだけでいけます。
便利なライブラリがあった
で、これラップして共通化したいなぁと思ったんですが、自分でやらなくても有志の人が作ってくれてるだろうと思ってnuget見てたら良いのがありました。 github.com