在 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 并且您不需要限定它,因为它无论如何都是独一无二的,这会给您更大的范围。