Informazioni sul ciclo di vita dei componenti Blazor

Completato

I componenti Blazor hanno un ciclo di vita ben definito che inizia quando vengono creati per la prima volta e termina quando vengono eliminati definitivamente. Il ciclo di vita del componente è regolato da un set di eventi che si verificano in risposta a trigger specifici. Tali trigger includono l'inizializzazione del componente, l'interazione degli utenti con il componente o la chiusura della pagina in cui si trova il componente.

In questa unità verranno illustrati gli eventi che si verificano durante il ciclo di vita di un componente Blazor. Verrà illustrato come gestire questi eventi per ottimizzare il lavoro eseguito e aumentare la velocità di risposta di una pagina Blazor.

Ciclo di vita dei componenti Blazor

I componenti Blazor rappresentano le viste nelle app Blazor, che definiscono il layout e la logica dell'interfaccia utente. I componenti generano markup HTML quando l'app viene eseguita. Gli eventi di interazione utente possono attivare codice personalizzato e i componenti possono essere aggiornati per ripristinare la visualizzazione. Alla chiusura della pagina, Blazor rimuove il componente e pulisce le risorse. Le nuove istanze vengono create quando l'utente torna alla pagina.

Il diagramma seguente illustra gli eventi che si verificano durante la durata di un componente e i metodi che è possibile usare per gestire questi eventi. Ad eccezione di SetParametersAsync, Blazor fornisce versioni sincrone e asincrone di ogni metodo.

Tutti i componenti Blazor derivano dalla classe ComponentBase o IComponent che definisce i metodi visualizzati e fornisce il comportamento predefinito. Per gestire un evento, eseguire l'override del metodo corrispondente.

The Blazor component lifecycle.

Anche se il diagramma suggerisce un singolo flusso in thread tra i metodi del ciclo di vita, le versioni asincrone di questi metodi consentono a un'app Blazor di accelerare il processo di rendering. Ad esempio, quando si verifica il primo await in SetParametersAsync, il componente Blazor esegue i metodi OnInitialized e OnInitializedAsync. Al termine dell'istruzione prevista, il thread di esecuzione in SetParametersAsync riprende.

La stessa logica si applica a tutta la serie di metodi del ciclo di vita. Inoltre, ogni operazione await che si verifica durante OnInitializedAsync e OnParametersSetAsync indica che lo stato del componente è stato modificato e può attivare un rendering immediato della pagina. Il rendering della pagina potrebbe essere eseguito più volte prima del completamento dell'inizializzazione.

Informazioni sui metodi relativi al ciclo di vita

Ogni metodo nel ciclo di vita dei componenti ha uno scopo specifico. È possibile eseguire l’override di questi metodi per implementare logiche personalizzate per il componente. La tabella seguente elenca i metodi del ciclo di vita nell'ordine in cui si verificano e ne descrive lo scopo.

Ordine Metodo del ciclo di vita Descrizione
1 Componente creato Viene creata un'istanza del componente.
2 SetParametersAsync Imposta i parametri dall'elemento padre del componente nell'albero di rendering.
3 OnInitialized / OnInitializedAsync Si verifica quando il componente è pronto per l'avvio.
4 OnParametersSet / OnParametersSetAsync Si verifica quando sono stati assegnati parametri e proprietà al componente.
5 OnAfterRender / OnAfterRenderAsync Si verifica dopo il rendering del componente.
6 Dispose / DisposeAsync Se il componente implementa IDisposable o IAsyncDisposable, viene eseguito il metodo appropriato quando il componente viene distrutto.

Metodo SetParametersAsync

Quando un utente visita una pagina che contiene un componente Blazor, il runtime di Blazor crea una nuova istanza del componente ed esegue il costruttore predefinito. Dopo aver costruito il componente, il runtime di Blazor chiama il metodo SetParametersAsync.

Se il componente definisce parametri, il runtime di Blazor inserisce i valori per questi parametri dall'ambiente chiamante nel componente. Questi parametri sono contenuti in un oggetto ParameterView e sono resi accessibili al metodo SetParametersAsync. È possibile chiamare il metodo base.SetParametersAsync per popolare le proprietà Parameter del componente con questi valori.

In alternativa, se è necessario gestire i parametri in modo diverso, è possibile farlo con questo metodo. Ad esempio, potrebbe essere necessario convalidare tutti i parametri passati al componente prima di usarli.

Nota

Il metodo SetParametersAsync viene sempre eseguito durante la creazione di un componente, indipendentemente dal fatto che esso non disponga di parametri.

Metodi OnInitialized e OnInitializedAsync

È possibile eseguire l'override dei metodi OnInitialized e OnInitializedAsync per includere funzionalità personalizzate. Questi metodi vengono eseguiti dopo che il metodo SetParametersAsync popola le proprietà basate su parametri del componente, che sono attribuiti con ParameterAttribute o CascadingParameterAttribute. Eseguire la logica di inizializzazione in questi metodi.

Se la proprietà render-mode dell'applicazione è impostata su Server, i metodi OnInitialized e OnInitializedAsync vengono eseguiti una sola volta per un'istanza del componente. Se un elemento padre del componente modifica i parametri del componente, il metodo SetParametersAsync viene eseguito di nuovo, ma questi metodi non verranno eseguiti. Se è necessario reinizializzare un componente quando si modificano i parametri, usare il metodo SetParametersAsync. Se si vuole eseguire l'inizializzazione una sola volta, usare questi metodi.

Se la proprietà render-mode è impostata su ServerPrerendered, i metodi OnInitialized e OnInitializedAsync vengono eseguiti due volte: una volta durante la fase di prerendering che genera l'output della pagina statica e un'altra volta quando il server stabilisce una connessione SignalR con il browser. In questi metodi è possibile eseguire attività di inizializzazione più complesse, ad esempio il recupero di dati da un servizio Web usato per impostare lo stato del componente Blazor. In questo caso, è consigliabile memorizzare nella cache le informazioni sullo stato durante la prima esecuzione e riutilizzare lo stato precedentemente salvato durante la seconda esecuzione.

Tutte le dipendenze usate dal componente Blazor vengono inserite dopo la creazione dell'istanza ma prima dell'esecuzione dei metodi OnInitialized o OnInitializedAsync. È possibile usare gli oggetti inseriti da queste dipendenze nei metodi OnInitialized o OnInitializedAsync, ma non prima.

Importante

I componenti Blazor non supportano l'inserimento delle dipendenze dei costruttori. Usare invece la direttiva @inject nel markup del componente o InjectAttribute nella dichiarazione di proprietà.

Durante la fase di prerendering, il codice in un componente Blazor Server non può eseguire azioni che richiedono una connessione al browser, ad esempio la chiamata di codice JavaScript. È consigliabile inserire la logica che dipende da una connessione con il browser nei metodi OnAfterRender o OnAfterRenderAsync.

Metodi OnParametersSet e OnParametersSetAsync

I metodi OnParametersSet e OnParametersSetAsync vengono eseguiti dopo il primo rendering del componente OnInitialized o OnInitializedAsync dopo il rendering successivo del metodo SetParametersAsync. Analogamente a SetParametersAsync, questi metodi vengono sempre chiamati, anche se il componente non dispone di parametri.

Usare uno dei metodi per completare le attività di inizializzazione che dipendono dai valori dei parametri del componente, ad esempio il calcolo dei valori per le proprietà calcolate. Non eseguire operazioni che richiedono un’esecuzione prolungata, come quelle in un costruttore. I costruttori sono sincroni e l'attesa del completamento delle operazioni a esecuzione prolungata influisce sulla velocità di risposta della pagina che contiene il componente.

Metodi OnAfterRender e OnAfterRenderAsync

I metodi OnAfterRender e OnAfterRenderAsync vengono eseguiti ogni volta che il runtime di Blazor deve aggiornare la visualizzazione rappresentata dal componente nell'interfaccia utente. Questo stato si verifica automaticamente quando:

  • Lo stato del componente cambia, ad esempio quando vengono eseguiti i metodi OnInitialized o OnInitializedAsync oppure quando vengono eseguiti i metodi OnParametersSet e OnParametersSetAsync.
  • Viene attivato un evento dell'interfaccia utente.
  • Il codice dell'applicazione chiama il metodo StateHasChanged del componente.

Quando viene chiamato StateHasChanged, da un evento esterno o da un trigger dell'interfaccia utente, il componente esegue di nuovo il rendering in modo condizionale. Nell'elenco seguente viene dettagliato l'ordine delle chiamate al metodo, incluso StateHasChanged e successivi:

  1. StateHasChanged: il componente è contrassegnato come necessario per eseguire il ripristino.
  2. ShouldRender: restituisce un flag che indica se il rendering del componente deve essere eseguito.
  3. BuildRenderTree: esegue il rendering del componente.

Il metodo StateHasChanged chiama il metodo ShouldRender del componente. Lo scopo di questo metodo consiste nel determinare se la modifica dello stato richiede un nuovo rendering della visualizzazione da parte del componente. Per impostazione predefinita, tutte le modifiche dello stato attivano un'operazione di rendering, ma è possibile sostituire il metodo ShouldRender e definire la logica decisionale. Il metodo ShouldRender restituisce true se è necessario eseguire il rendering della visualizzazione o, in caso contrario, false.

Se il componente richiede il rendering, è possibile usare il metodo BuildRenderTree per generare un modello che può essere usato per aggiornare la versione del DOM usata dal browser per visualizzare l'interfaccia utente. È possibile usare l'implementazione predefinita del metodo fornito dalla classe ComponentBase, oppure eseguire l’override con la logica personalizzata in caso di requisiti specifici.

Viene quindi eseguito il rendering della visualizzazione del componente e viene aggiornata l'interfaccia utente. Infine, il componente esegue i metodi OnAfterRender e OnAfterRenderAsync. A questo punto, l'interfaccia utente è completamente funzionante ed è possibile interagire con JavaScript e tutti gli elementi nel DOM. Usare questi metodi per eseguire altre procedure che richiedono l'accesso al contenuto sottoposto a rendering completo, ad esempio chiamare il codice JavaScript dall'interoperabilità JS.

I metodi OnAfterRender e OnAfterRenderAsync accettano un parametro booleano denominato firstRender. Questo parametro è true la prima volta che vengono eseguiti i metodi, ma è false successivamente. È possibile valutare questo parametro per eseguire operazioni singole che potrebbero essere inutili e che richiedono troppo risorse se vengono ripetute ogni volta che viene eseguito il rendering del componente.

Nota

Non confondere il prerendering con il primo rendering per un componente Blazor. Il prerendering si verifica prima che venga stabilita una connessione SignalR con il browser e genera una versione statica di una pagina. Il primo rendering si verifica quando la connessione con il browser è completamente attiva e tutte le funzionalità sono disponibili.

Metodi Dispose e DisposeAsync

Come tutte le classi .NET, un componente Blazor può usare risorse gestite e non gestite. Il runtime recupera automaticamente le risorse gestite. Tuttavia, è necessario implementare le interfacce IDisposable o IAsyncDisposable e fornire un metodo Dispose o DisposeAsync per rilasciare le risorse non gestite. In questo modo si riducono le probabilità di perdite di memoria nel server.

Gestire le eccezioni nei metodi del ciclo di vita

Se un metodo del ciclo di vita per un componente Blazor ha esito negativo, la connessione SignalR al browser viene chiusa che a sua volta causa l'arresto del funzionamento dell'app Blazor. Per evitare questo esito, assicurarsi di essere pronti a gestire le eccezioni come parte della logica per i metodi del ciclo di vita. Per altre informazioni, vedere Gestire gli errori nelle app ASP.NET Core Blazor.

Verificare le conoscenze

1.

Quale di questi eventi non fa parte del ciclo di vita del componente Blazor?

2.

Quale di questi eventi non attiva l'evento SetParametersAsync?