روش دوم پیاده سازی این مثال: ارسال یک کامپوننت محصور کنندهی سراسری، به صورت پارامتر آبشاری، به تمام زیر کامپوننتها
با استفاده از پارامترهای آبشاری میتوان شیءای را در اختیار تمام کامپوننتهای قرار گرفته شدهی در سلسله مراتب آنها قرار داد. برای مثال اگر در فایل Client\Shared\MainLayout.razor، جائیکه سایر کامپوننتها قرار است رندر شوند را توسط یک کامپوننت سطح بالا محصور کنیم:
در این حالت هر کامپوننتی که بجای Body درج شود، میتواند به پارامترهای آبشاری Alert دسترسی پیدا کند؛ یعنی تمام کامپوننتهای نمایشی برنامه. یا حتی میتوان این Alert را در فایل Client\App.razor نیز در بالاترین سطح قرار داد و کل Router را توسط آن محصور کرد.
بنابراین طراحی سادهی کامپوننت Alert ای (Client\Shared\Alert.razor) که تامین کنندهی یک پارامتر آبشاری سراسری است، به صورت زیر میتواند باشد:
که البته در همان پوشه به همراه فایل Client\Shared\AlertType.cs نیز هست:
در کامپوننت ویژهی Alert، دو قابلیت استاندارد Blazor بکار گرفته شدهاند:
الف) وجود یک CascadingValue که اینبار Value آن به خود کامپوننت اشاره میکند (Value=this). یعنی پارامتر آبشاری که در اختیار سایر کامپوننتهای محصور شدهی توسط آن ارسال میشود، دقیقا وهلهای از کامپوننت Alert است که توسط آن میتوان برای مثال، متد عمومی ShowAlert آنرا فراخوانی کرد:
ب) چون کامپوننت Alert قرار است کامپوننتهایی را که بجای body@ درج میشوند را نمایش دهد، اینکار را توسط یک RenderFragment انجام دادهاست.
پس از درج این کامپوننت در فایل layout، روش استفادهی از آن برای مثال در کامپوننت Index به صورت زیر است:
در اینجا پارامتر آبشاری که دریافت میشود، دقیقا به کلاس و شیء Alert (وهلهای از کامپوننت Alert) اشاره میکند. به همین جهت میتوان متد عمومی ShowAlert آنرا در اینجا فراخوانی کرد.
پ.ن.
در طراحی Blazor، از طراحی React الهام گرفته شدهاست و CascadingValue آن دقیقا معادل Context API جدید React است.
با استفاده از پارامترهای آبشاری میتوان شیءای را در اختیار تمام کامپوننتهای قرار گرفته شدهی در سلسله مراتب آنها قرار داد. برای مثال اگر در فایل Client\Shared\MainLayout.razor، جائیکه سایر کامپوننتها قرار است رندر شوند را توسط یک کامپوننت سطح بالا محصور کنیم:
<Alert> @Body </Alert>
بنابراین طراحی سادهی کامپوننت Alert ای (Client\Shared\Alert.razor) که تامین کنندهی یک پارامتر آبشاری سراسری است، به صورت زیر میتواند باشد:
<CascadingValue Value=this> @if(IsVisible) { <div class="alert @Css" role="alert"> @Message <button type="button" class="close" data-dismiss="alert" aria-label="Close" @onclick="HideAlert"> <span aria-hidden="true">×</span> </button> </div> } @ChildContent </CascadingValue> @code { [Parameter] public RenderFragment ChildContent { get; set; } private bool IsVisible; private string Message; private string Css = "alert-primary"; public void ShowAlert(string message, AlertType alertType) { IsVisible = true; Message = message; Css = alertType switch { AlertType.Success => "alert-success", AlertType.Info => "alert-primary", AlertType.Danger => "alert-danger", AlertType.Warning => "alert-warning", _ => "alert-primary" }; StateHasChanged(); } public void HideAlert() { IsVisible = false; } }
namespace BlazorWasmAlert.Client.Shared { public enum AlertType { Success, Info, Danger, Warning } }
الف) وجود یک CascadingValue که اینبار Value آن به خود کامپوننت اشاره میکند (Value=this). یعنی پارامتر آبشاری که در اختیار سایر کامپوننتهای محصور شدهی توسط آن ارسال میشود، دقیقا وهلهای از کامپوننت Alert است که توسط آن میتوان برای مثال، متد عمومی ShowAlert آنرا فراخوانی کرد:
<CascadingValue Value=this>
پس از درج این کامپوننت در فایل layout، روش استفادهی از آن برای مثال در کامپوننت Index به صورت زیر است:
@page "/" <h1>Hello, world!</h1> <button class="btn btn-primary" @onclick="ShowAlert">Show Alert!</button> @code { [CascadingParameter] public Alert Alert { get; set; } private void ShowAlert() { Alert.ShowAlert("This is a test!", AlertType.Info); } }
پ.ن.
در طراحی Blazor، از طراحی React الهام گرفته شدهاست و CascadingValue آن دقیقا معادل Context API جدید React است.