来自以下网站:
Stateful reconnection after prerendering
在 Blazor 服务器应用中,当 RenderMode 为 ServerPrerendered 时,组件最初作为页面的一部分静态呈现。一旦浏览器与服务器建立 SignalR 连接,该组件就会再次呈现并进行交互。如果存在用于初始化组件的 OnInitialized{Async} 生命周期方法,则该方法会执行两次:
当组件被静态预渲染时。
建立服务器连接后。
这可能会导致最终呈现组件时 UI 中显示的数据发生显着变化。为避免在 Blazor Server 应用中出现这种双重渲染行为,请传入一个标识符以在预渲染期间缓存状态并在预渲染后检索状态。
以下代码在基于模板的 Blazor Server 应用中演示了更新的 WeatherForecastService,该应用可避免双重呈现。在以下示例中,等待的延迟 (await Task.Delay(...)) 在从 GetForecastAsync 方法返回数据之前模拟了一个短暂的延迟。
WeatherForecastService.cs
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.Caching.Memory;
using BlazorSample.Shared;
public class WeatherForecastService
{
private static readonly string[] summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild",
"Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
public WeatherForecastService(IMemoryCache memoryCache)
{
MemoryCache = memoryCache;
}
public IMemoryCache MemoryCache { get; }
public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)
{
return MemoryCache.GetOrCreateAsync(startDate, async e =>
{
e.SetOptions(new MemoryCacheEntryOptions
{
AbsoluteExpirationRelativeToNow =
TimeSpan.FromSeconds(30)
});
var rng = new Random();
await Task.Delay(TimeSpan.FromSeconds(10));
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = startDate.AddDays(index),
TemperatureC = rng.Next(-20, 55),
Summary = summaries[rng.Next(summaries.Length)]
}).ToArray();
});
}
}