【发布时间】:2021-05-02 16:56:15
【问题描述】:
背景: 我们有一个 Blazor 应用程序,其中包含以下 3 个文件:
- ChildComponent.razor
- ParentComponent.razor
- Test.razor(这是消费者,它使用父组件)
ChildComponent.razor
<div>
@if(Body != null)
{
@Body
}
@if(Footer != null)
{
<div class="footer">
@Footer
</div>
}
</div>
@code
{
[Parameter]
public RenderFragment Body { get; set; }
[Parameter]
public RenderFragment Footer { get; set; }
}
ParentComponent.razor
ParentComponent 使用 ChildComponent。我们想将ParentFooter 传递给子组件的Footer:
<ChildComponent Footer="ParentFooter">
<Body>
<p>@Text</p>
</Body>
</ChildComponent>
@code
{
[Parameter]
public string Text { get; set; }
[Parameter]
public RenderFragment ParentFooter { get; set; }
}
使用文件是 Test.razor,如下所示:
<ParentComponent Text="Hello World"></ParentComponent>
我们在这里不使用<ParentFooter></ParentFooter>,因为页脚是可选的。
问题:
我们在浏览器的控制台中得到一个异常:
未处理的异常渲染组件:委托给一个实例 方法不能有 null 'this'(参数 'this')
可能的解决方案:
在文件ParentComponent.razor中,我们通过引用传递Footer并进行null-check:
<ChildComponent Footer="ParentFooter" @ref="m_ChildComponentRef">
<Body>
<p>@Text</p>
</Body>
</ChildComponent>
@code
{
[Parameter]
public string Text { get; set; }
[Parameter]
public RenderFragment ParentFooter { get; set; }
private ChildComponent m_ChildComponentRef { get; set; }
protected override void OnParametersSet()
{
base.OnParametersSet();
if (ParentFooter != null)
{
m_ChildComponentRef.Footer = ParentFooter;
}
}
}
但这是一个不好的方法,因为我们会收到警告:
BL0005:组件参数不应设置在其组件之外。
问题:我们如何将可选的 RenderFragment 传递给子组件?
【问题讨论】:
-
你解决了这个问题还是你还想知道这个?
标签: c# razor blazor blazor-client-side blazor-webassembly