为了避免Blazor本地存储SetItemAsync在不同页面之间发生竞争条件,可以创建一个服务来控制存储和访问本地存储的代码。
以下是示例代码:
LocalStorageService.cs
public class LocalStorageService
{
private readonly IJSRuntime _jsRuntime;
public LocalStorageService(IJSRuntime jsRuntime)
{
_jsRuntime = jsRuntime;
}
public async Task SetItemAsync(string key, T value)
{
var json = JsonSerializer.Serialize(value);
await _jsRuntime.InvokeVoidAsync("localStorage.setItem", key, json);
}
public async Task GetItemAsync(string key)
{
var json = await _jsRuntime.InvokeAsync("localStorage.getItem", key);
return json == null ? default : JsonSerializer.Deserialize(json);
}
}
使用LocalStorageService:
@inject LocalStorageService LocalStorage
@code {
private async Task SaveData()
{
await LocalStorage.SetItemAsync("myKey", "myValue");
}
private async Task LoadData()
{
var myValue = await LocalStorage.GetItemAsync("myKey");
}
}
通过创建LocalStorageService,可以确保在多个页面中对本地存储的访问不会导致竞争条件。