在 MainLayout 上设置参数的最佳实践

时间:2021-05-04 16:08:31

标签: c# blazor blazor-webassembly

我有一套 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.
}

2 个答案:

答案 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 并且您不需要限定它,因为它无论如何都是独一无二的,这将为您提供更多的范围。