是否可以在 Blazor 中为父组件和子组件指定两个不同的类型参数值?

Posted

技术标签:

【中文标题】是否可以在 Blazor 中为父组件和子组件指定两个不同的类型参数值?【英文标题】:Is it possible to specify two different type param values for parent and child components in Blazor? 【发布时间】:2021-10-26 10:45:48 【问题描述】:

请参考以下代码块。对于该代码块,我尝试将父组件值访问到子组件中,但它总是在子组件中返回空值。

<Parent TValue="TreeData">
 <Child TValue="TreeNode<TreeData>"></Child>
</Parent>

@code 
    public class TreeData
    
        public string Value  get; set; 
    
    public class TreeNode<TreeData>
    
        public int Count  get; set; 
    


**Parent Component:**

<CascadingValue Value="@this">
    @ChildContent
</CascadingValue>

**Child Component:** 

@code 
    [CascadingParameter]
    private Parent<TValue> ParentObj  get; set; 
    protected override async Task OnInitializedAsync()
    
        await base.OnInitializedAsync();
        //Parent obj always returns the null value
        ParentObj?.UpdateChildProperties("UpdateData", this);
        

【问题讨论】:

我正在努力拼凑您的代码并创建一个工作示例。能否将代码重构为父子组件? 【参考方案1】:

需要考虑的一些一般事项:

    确保您的子组件(或您的 _Imports.razor)具有该命名空间的 using 语句。 子项中的 [CascadingParameter] 必须是公共的。 将 [CascadingParameter] 的类型设为父级的名称(不带 .razor) 如果您有多个不同的类型要作为级联参数传递,这很好,只需在子级中创建另一个 [CascadingParameter]。 如果他们需要在子组件中使用相同的 [CascadingParameter],那么所有那些被传递下来的类型都必须继承自同一个类 (.razor)。这个 .razor 可以是空的,只要确保包含 @inherits (无论你的基本类型是什么),并使孩子中 [CascadingParameter] 的类型成为基本类型,并且在初始化时你可以检查类型并强制转换它如果需要。

我相信做这些事情应该可以解决这个问题,但正如 Curtis 在评论中提到的那样 - 很难以分离方式遵循此代码。

【讨论】:

以上是关于是否可以在 Blazor 中为父组件和子组件指定两个不同的类型参数值?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以通过“http 请求”和通过 DI 在 Blazor 组件中的“DI 范围”中为每个用户提供持久性?

在 Laravel 中为父级和子级创建活动类

Blazor 组件:从子组件更新模型时刷新父组件

在 Xcode 中为两个相同的选择器组件指定数组

Blazor 服务端组件 Render, RenderFragment ,RenderTreeBuilder, CascadingValue/CascadingParameter

Blazor University 组件 — 创建组件