我有一套 Blazor 微型网站。它们都共享同一个 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.
}
答案 0 :(得分:1)
我会这样做:
将 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;
}
请注意,您可以使用服务获得相同的功能……但是,我认为,在这种情况下,这更可取。
答案 1 :(得分:1)
这是一种完全有效的方法,我已经使用过。但是,我能否就实施提出一些建议。
在你的实现中,你只能有一个布尔值作为级联值 - 你没有给它一个 name 属性。因此,如果您继续使用 bool,我建议您使用名称来限定级联 - see MS Docs for details。
您应该考虑级联一个对象,例如 LayoutOptions
,其中 optionalthing
只是一个属性。如果您决定拥有多个 optionalthing
并且您不需要限定它,因为它无论如何都是独一无二的,这将为您提供更多的范围。