在 MainLayout 上设置参数的最佳实践
Best practice for setting parameter on MainLayout
我有一套 Blazor Micro-Sites。它们都共享相同的 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;
}
请注意,您可以使用服务获得相同的功能...但是,我认为,在这种情况下这是更可取的。
这是一个非常有效的方法,我已经用过了。不过,我可以就实施提出一些建议吗?
在您的实现中,您只能将一个布尔值作为级联值 - 您还没有给它命名 属性。因此,如果您要继续使用 bool,我建议您使用名称限定级联 - see MS Docs for details.
您应该考虑级联一个对象,比如 LayoutOptions
,其中 optionalthing
只是一个 属性。如果您决定拥有多个 optionalthing
并且您不需要限定它,因为它无论如何都是独一无二的,这会给您更大的范围。
我有一套 Blazor Micro-Sites。它们都共享相同的 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;
}
请注意,您可以使用服务获得相同的功能...但是,我认为,在这种情况下这是更可取的。
这是一个非常有效的方法,我已经用过了。不过,我可以就实施提出一些建议吗?
在您的实现中,您只能将一个布尔值作为级联值 - 您还没有给它命名 属性。因此,如果您要继续使用 bool,我建议您使用名称限定级联 - see MS Docs for details.
您应该考虑级联一个对象,比如 LayoutOptions
,其中 optionalthing
只是一个 属性。如果您决定拥有多个 optionalthing
并且您不需要限定它,因为它无论如何都是独一无二的,这会给您更大的范围。