我有一套Blazor Micro站点。它们都共享相同的MainLayout,该布局是作为组件库中的组件创建的。这是为了加强一致的外观和感觉。
一些微型站点需要在MainLayout中设置子组件的Visible参数,该参数又作为MainLayout上的参数公开。
我已经用CascadingParameter实现了这一点,但这似乎是错误的方法。
这是唯一的方法吗?这是最好的方法吗?有没有直接设置参数的方法?下面的代码,为了简单起见,删除了一些代码。
<CascadingValue Value="OptionalThingVisible">
<AuthorizeRouteView DefaultLayout="@typeof(MainLayout)">
<NotAuthorized>
<RedirectToLogin />
</NotAuthorized>
</AuthorizeRouteView>
</CascadingValue>
@code {
bool OptionalThingVisible = false; //It's hard-coded and won't change.
}
我会这样做:
向感兴趣的各方级联对MainLayout的引用,如下所示:
<CascadingValue Value="this">
//....
</CascadingValue>
定义布尔属性以获取值:
@code
{
private bool _value;
public bool Value
{
get => _value;
set
{
if( _value != value)
{
_value == value
InvokeAsync(() => StateHasChanged());
}
}
}
您的MainLayout现在应该是这样的:
<CascadingValue Value="this">
//....
<SubComponent Value ="Value" />
</CascadingValue>
这就是您从感兴趣的各方传递布尔值的方式:
// Gets a reference to the MainLayout component
[CascadingParameter]
public MainLayout Layout { get; set; }
protected override void OnInitialized()
{
Layout.Value= false;
}
请注意,您可以使用服务获得相同的功能。。。但是,我认为,在这种情况下,这样做更可取。
这是我使用过的一种非常有效的方法。然而,我可以就实施提出几点建议。
在您的实现中,您只能有一个布尔值作为级联值——您没有给它一个name属性。因此,如果你想继续使用bool,我建议你用一个名字来限定级联——有关详细信息,请参阅MS文档。
您应该考虑级联一个对象,比如LayoutOptions
,其中optionalthing
只是一个属性。如果您决定拥有多个optionalthing
,并且不需要对其进行限定,因为它无论如何都是唯一的,那么这将为您提供更大的范围。