@page "/weather" @rendermode InteractiveServer @attribute [StreamRendering] Weather

Weather

This component demonstrates showing data.

@if (isLoading) {

pre-loading...

} else {

Current count: @currentCount

@if (forecasts == null) {

Loading...

} else { @foreach (var forecast in forecasts) { }
Date Temp. (C) Temp. (F) Summary
@forecast.Date.ToShortDateString() @forecast.TemperatureC @forecast.TemperatureF @forecast.Summary
} } @code { private bool isLoading = false; private int currentCount = 0; private void IncrementCount() { currentCount++; Console.WriteLine($"Curr: {currentCount}"); } private WeatherForecast[]? forecasts; [Inject] private IJSRuntime JS { get; set; } = null!; // protected override async Task OnInitializedAsync() // { // // Simulate asynchronous loading to demonstrate streaming rendering // isLoading = true; // await InvokeAsync(StateHasChanged); // await Task.Delay(400); // isLoading = false; // await InvokeAsync(StateHasChanged); // await Task.Delay(600); // LoadForecasts(); // } private bool _interactiveStarted; private bool _loadingStarted; protected override async Task OnAfterRenderAsync(bool firstRender) { if (!firstRender) return; // Prova una semplice chiamata JS: se fallisce siamo in prerender try { await JS.InvokeVoidAsync("console.debug", "client active check"); _interactiveStarted = true; } catch { _interactiveStarted = false; } if (_interactiveStarted && !_loadingStarted) { _loadingStarted = true; await StartLoadingAsync(); // avvia il lavoro "pesante" solo qui } } private async Task StartLoadingAsync() { // esempio: simulazione caricamento isLoading = true; StateHasChanged(); await Task.Delay(400); isLoading = false; StateHasChanged(); await Task.Delay(600); // carica i dati veri LoadForecasts(); StateHasChanged(); } private void LoadForecasts() { var startDate = DateOnly.FromDateTime(DateTime.Now); var summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; forecasts = Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = startDate.AddDays(index), TemperatureC = Random.Shared.Next(-20, 55), Summary = summaries[Random.Shared.Next(summaries.Length)] }).ToArray(); } private class WeatherForecast { public DateOnly Date { get; set; } public int TemperatureC { get; set; } public string? Summary { get; set; } public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); } }