[Blazor]LocalStorageにデータを保存する
IJSRuntimeで、localStorage.setItemやlocalStorage.getItemを使う。
複雑なデータを扱うときは、jsonにserialize/deserializeする。
セッションだけにしたかったら、localStorageをsessionStorageにする。
@page "/LocalStorageSample"
@using Newtonsoft.Json
<h3>LocalStorageSample</h3>
<h4>string</h4>
<div>
    <input type="text" @bind="setTokenString">
    <button type="button" @onclick="SetToken">Set</button>
</div>
<div>
    <button type="button" @onclick="GetToken">Get</button>
    @getTokenResult
</div>
<div>
    <button type="button" @onclick="RemoveToken">Remove</button>
</div>
<h4>object</h4>
<div>
    <input type="text" @bind="userId">
    <input type="text" @bind="userName">
    <button type="button" @onclick="SetUserData">Set</button>
</div>
<div>
    <button type="button" @onclick="GetUserData">Get</button>
    @userData.UserId
    @userData.UserName
</div>
<div>
    <button type="button" @onclick="RemoveUserData">Remove</button>
</div>
@code {
    [Inject]
    private IJSRuntime JSRuntime { get; set; }
    private string setTokenString = "";
    private string getTokenResult = "-";
    private UserData userData = new UserData();
    private string userId = "";
    private string userName = "";
    private async Task SetToken()
    {
        await JSRuntime.InvokeVoidAsync("localStorage.setItem", "token", setTokenString);
    }
    
    private async Task GetToken()
    {
        getTokenResult = await JSRuntime.InvokeAsync<string>("localStorage.getItem", "token");
    }
    private async Task RemoveToken()
    {
        await JSRuntime.InvokeVoidAsync("localStorage.removeItem", "token");
    }
    private async Task SetUserData()
    {
        await JSRuntime.InvokeVoidAsync(
            "localStorage.setItem", 
            "userData", 
            JsonConvert.SerializeObject(
                new UserData { 
                    UserId = userId, 
                    UserName = userName 
                }
            ));
    }
    
    private async Task GetUserData()
    {
        var json = await JSRuntime.InvokeAsync<string>("localStorage.getItem", "userData");
        userData = json is null ? new UserData() : JsonConvert.DeserializeObject<UserData>(json);
    }
    private async Task RemoveUserData()
    {
        await JSRuntime.InvokeVoidAsync("localStorage.removeItem", "userData");
    }
    public class UserData
    {
        public string UserId { get; set; }
        public string UserName { get; set; }
    }
}
