是否可以在 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 范围”中为每个用户提供持久性?
Blazor 服务端组件 Render, RenderFragment ,RenderTreeBuilder, CascadingValue/CascadingParameter