【问题标题】:Is it possible to specify two different type param values for parent and child components in Blazor?是否可以在 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);
    }    
}

【问题讨论】:

  • 我正在努力拼凑您的代码并创建一个工作示例。能否将代码重构为父子组件?

标签: blazor blazor-server-side asp.net-blazor


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-31
    • 2023-02-03
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多