Présentation du cycle de vie d’un composant Blazor

Effectué

Les composants Blazor ont un cycle de vie bien défini qui commence quand ils sont créés pour la première fois et se termine quand ils sont détruits. Le cycle de vie des composants est régi par un ensemble d’événements qui se produisent en réponse à des déclencheurs spécifiques. Ces déclencheurs sont par exemple le composant en cours d’initialisation, les interactions d’un utilisateur avec le composant ou la fermeture de la page où se trouve le composant.

Dans cette unité, vous découvrez les événements qui se produisent pendant le cycle de vie des composants Blazor. Vous verrez comment gérer ces événements pour optimiser le travail effectué et augmenter la réactivité d’une page Blazor.

Le cycle de vie des composants Blazor

Les composants Blazor représentent les vues dans les applications Blazor, qui définissent la disposition et la logique de l’interface utilisateur. Les composants génèrent un balisage HTML lors de l’exécution de l’application. Les événements d’interaction utilisateur peuvent déclencher du code personnalisé et les composants peuvent être mis à jour pour effectuer un nouveau rendu de l’affichage. Lors de la fermeture de la page, Blazor supprime le composant et nettoie les ressources. De nouvelles instances sont créées lorsque l’utilisateur retourne sur la page.

Le diagramme suivant illustre les événements qui se produisent pendant la durée de vie d’un composant, ainsi que les méthodes permettant de les gérer. Blazor fournit des versions synchrones et asynchrones de chaque méthode, à l’exception de SetParametersAsync.

Tous les composants Blazor descendent de la classe ComponentBase ou du IComponent, qui définit les méthodes montrées et fournit le comportement par défaut. Pour gérer un événement, vous devez remplacer la méthode correspondante.

Cycle de vie d’un composant Blazor.

Bien que le diagramme implique qu’il existe un flux à un seul thread entre les méthodes du cycle de vie, les versions asynchrones de ces méthodes permettent à une application Blazor d’accélérer le processus de rendu. Par exemple, quand le premier await se produit dans SetParametersAsync, le composant Blazor exécute les méthodes OnInitialized et OnInitializedAsync. Quand l’instruction dont l’exécution est attendue se termine, le thread d’exécution de SetParametersAsync reprend.

La même logique s’applique à toute une série de méthodes du cycle de vie. En outre, chaque opération await qui se produit pendant OnInitializedAsync et OnParametersSetAsync indique que l’état du composant a changé, ce qui peut déclencher un rendu immédiat de la page. Celle-ci est susceptible d’être affichée plusieurs fois avant l’achèvement complet de l’initialisation.

Comprendre les méthodes du cycle de vie

Chaque méthode du cycle de vie d’un composant a un objectif spécifique, et vous pouvez remplacer les méthodes pour ajouter de la logique personnalisée à votre composant. Le tableau suivant répertorie les méthodes du cycle de vie dans l’ordre où elles se produisent, et décrit leur objectif.

Commande Méthode du cycle de vie Description
1 Composant créé Le composant est instancié.
2 SetParametersAsync Définit des paramètres depuis le parent du composant dans l’arborescence de rendu.
3 OnInitialized / OnInitializedAsync Se produit quand le composant est prêt à démarrer.
4 OnParametersSet / OnParametersSetAsync Se produit quand le composant a reçu des paramètres et que des propriétés ont été affectées.
5 OnAfterRender / OnAfterRenderAsync Se produit après le rendu du composant.
6 Dispose / DisposeAsync Si le composant implémente IDisposable ou IAsyncDisposable, la suppression appropriée se produit dans le cadre de la destruction du composant.

La méthode SetParametersAsync

Quand un utilisateur visite une page qui contient un composant Blazor, le runtime Blazor crée une nouvelle instance du composant et exécute le constructeur par défaut. Une fois le composant construit, le runtime Blazor appelle la méthode SetParametersAsync.

Si le composant définit des paramètres, le runtime Blazor injecte les valeurs de ces paramètres provenant de l’environnement appelant dans le composant. Ces paramètres sont contenus dans un objet ParameterView et rendus accessibles à la méthode SetParametersAsync. La méthode base.SetParametersAsync permet de remplir les propriétés de Parameter de votre composant avec ces valeurs.

Si vous devez gérer les paramètres d’une autre façon, cette méthode est l’endroit approprié pour le faire. Par exemple, vous devrez peut-être valider tous les paramètres transmis au composant avant de les utiliser.

Notes

La méthode SetParametersAsync s’exécute toujours lorsqu’un composant est créé, même si celui-ci ne possède pas de paramètres.

Les méthodes OnInitialized et OnInitializedAsync

Vous pouvez remplacer les méthodes OnInitialized et OnInitializedAsync pour inclure des fonctionnalités personnalisées. Ces méthodes s’exécutent après que la méthode SetParametersAsync remplit les propriétés basées sur les paramètres du composant, qui sont attribuées avec ParameterAttribute ou CascadingParameterAttribute. Vous exécutez la logique d’initialisation dans ces méthodes.

Si la propriété render-mode de l’application est définie sur Server, les méthodes OnInitialized et OnInitializedAsync s’exécutent une seule fois pour une instance du composant. Si un parent du composant modifie les paramètres du composant, la méthode SetParametersAsync s’exécute à nouveau, mais pas ces méthodes. Si vous devez réinitialiser un composant quand les paramètres changent, utilisez la méthode SetParametersAsync. Pour procéder une seule fois à l’initialisation, servez-vous de ces méthodes.

Si la propriété render-mode est définie sur ServerPrerendered, les méthodes OnInitialized et OnInitializedAsync s’exécutent deux fois : une fois pendant la phase de prérendu qui génère la sortie de la page statique, et à nouveau quand le serveur a établi une connexion SignalR avec le navigateur. Vous pouvez effectuer des tâches d’initialisation coûteuses en temps dans ces méthodes, comme récupérer des données auprès d’un service web que vous utilisez pour définir l’état du composant Blazor. Dans ce cas, mettez en cache les informations d’état pendant la première exécution et réutilisez l’état enregistré lors de la deuxième exécution.

Les dépendances utilisées par le composant Blazor sont injectées lorsque l’instance a été créée, mais avant l’exécution des méthodes OnInitialized et OnInitializedAsync. Vous pouvez utiliser les objets injectés par ces dépendances dans les méthodes OnInitialized et OnInitializedAsync, mais pas avant.

Important

Les composants Blazor ne prennent pas en charge l’injection de dépendances sur un constructeur. Au lieu de cela, utilisez la directive @inject dans le balisage du composant ou InjectAttribute sur la déclaration de propriété.

Pendant la phase de pré-rendu, le code d’un composant Blazor Server ne peut pas effectuer des actions qui exigent une connexion au navigateur, comme appeler du code JavaScript. Vous devez placer la logique qui dépend d’une connexion avec le navigateur dans les méthodes OnAfterRender ou OnAfterRenderAsync.

Les méthodes OnParametersSet et OnParametersSetAsync

Les méthodes OnParametersSet et OnParametersSetAsync s’exécutent après les méthodes OnInitialized et OnInitializedAsync la première fois que le rendu du composant est effectué, ou après la méthode SetParametersAsync dans les rendus suivants. Comme SetParametersAsync, elles sont toujours appelées, même si le composant ne comporte pas de paramètres.

Utilisez une des méthodes pour effectuer des tâches d’initialisation qui dépendent des valeurs des paramètres du composant, par exemple déterminer la valeur de propriétés calculées. N’effectuez pas d’opérations d’une durée longue, comme celles qui sont dans un constructeur. Les constructeurs étant synchrones, le fait d’attendre la fin d’opérations d’une durée longue affecte la réactivité de la page qui contient le composant.

Méthodes OnAfterRender et OnAfterRenderAsync

Les méthodes OnAfterRender et OnAfterRenderAsync s’exécutent chaque fois que le runtime Blazor doit mettre à jour la vue représentée par le composant dans l’interface utilisateur. Cet état se produit automatiquement quand :

  • L’état du composant change, par exemple quand les méthodes OnInitialized ou OnInitializedAsync ou les méthodes OnParametersSetOnParametersSetAsync s’exécutent.
  • Un événement d’interface utilisateur est déclenché.
  • Le code de l’application appelle la méthode StateHasChanged du composant.

Quand StateHasChanged est appelé, depuis un événement externe ou un déclencheur de l’interface utilisateur, le rendu du composant est à nouveau effectué de façon conditionnelle. La liste suivante détaille l’ordre des appels de méthode, notamment StateHasChanged :

  1. StateHasChanged : le composant est marqué comme nécessitant un nouveau rendu.
  2. ShouldRender : retourne un indicateur indiquant si le rendu du composant doit s’effectuer.
  3. BuildRenderTree : effectue le rendu du composant.

La méthode StateHasChanged appelle la méthode ShouldRender du composant. L’objectif de cette méthode est de déterminer si le changement d’état exige que le composant effectue à nouveau un rendu de la vue. Par défaut, toutes les modifications d’état déclenchent une opération de rendu. Cependant, vous pouvez remplacer la méthode ShouldRender pour définir votre logique de prise de décision. La méthode ShouldRender retourne true si la vue doit être affichée à nouveau, false sinon.

Si un rendu est nécessaire pour le composant, vous pouvez utiliser la méthode BuildRenderTree pour générer un modèle qui peut mettre à jour la version du modèle DOM que le navigateur utilise pour afficher l’interface utilisateur. Vous pouvez utiliser l’implémentation par défaut de la méthode qui est fournie par la classe ComponentBase, ou bien la remplacer par une logique personnalisée si vous avez des exigences spécifiques.

Ensuite, la vue du composant est affichée et l’interface utilisateur est mise à jour. Enfin, le composant exécute les méthodes OnAfterRender et OnAfterRenderAsync. À ce stade, l’interface utilisateur est entièrement fonctionnelle, et vous pouvez interagir avec JavaScript et les éléments du modèle DOM. Utilisez ces méthodes pour effectuer les autres étapes qui nécessitent un accès au contenu entièrement rendu, par exemple appeler du code JavaScript depuis l’interopérabilité JS.

Les méthodes OnAfterRender et OnAfterRenderAsync prennent un paramètre booléen appelé firstRender. Ce paramètre a la valeur true la première fois que les méthodes sont exécutées, mais false par la suite. Vous pouvez évaluer ce paramètre pour effectuer des opérations ponctuelles susceptibles de se révéler inutiles et trop consommatrices de ressources si elles étaient répétées chaque fois que le composant est rendu.

Notes

Ne confondez pas le prérendu avec le premier affichage d’un composant Blazor. Le prérendu se produit avant l’établissement d’une connexion SignalR avec le navigateur, et il génère une version statique d’une page. Le premier rendu a lieu quand la connexion au navigateur est entièrement active et que toutes les fonctionnalités sont disponibles.

Les méthodes Dispose et DisposeAsync

Comme toute classe .NET, un composant Blazor peut utiliser des ressources managées et non managées. Le runtime récupère automatiquement les ressources managées. Vous devez cependant implémenter l’interface IDisposable ou IAsyncDisposable, et fournir une méthode Dispose ou DisposeAsync pour libérer les ressources non managées. Cette pratique réduit les risques de fuites de mémoire sur le serveur.

Gestion des exceptions dans les méthodes de cycle de vie

Si une méthode de cycle de vie d’un composant Blazor échoue, elle ferme la connexion SignalR au navigateur, ce qui entraîne l’arrêt du fonctionnement de l’application Blazor. Pour éviter ce résultat, vérifiez que vous êtes prêt à gérer les exceptions dans le cadre de la logique pour les méthodes de cycle de vie. Pour plus d’informations, consultez Gérer les erreurs dans les applications Blazor ASP.NET Core.

Vérifiez vos connaissances

1.

Parmi ces événements, lequel ne fait pas partie du cycle de vie des composants Blazor ?

2.

Parmi ces événements, lequel ne déclenche pas l’événement SetParametersAsync ?