Blazor古怪与ChildContent渲染片段
这个问题已经被问过了,但是重新提交一个更清晰的例子(希望如此) 当我试图确定Blazor何时以及如何重新呈现和更新状态时,我注意到了这种奇怪的行为 采用以下简单组件Blazor古怪与ChildContent渲染片段,blazor,blazor-server-side,Blazor,Blazor Server Side,这个问题已经被问过了,但是重新提交一个更清晰的例子(希望如此) 当我试图确定Blazor何时以及如何重新呈现和更新状态时,我注意到了这种奇怪的行为 采用以下简单组件Test1Component: @if (_show) { <h3>Test1Component</h3> } @code { private bool _show = true; public void Show() { _show = true; }
Test1Component
:
@if (_show) {
<h3>Test1Component</h3>
}
@code {
private bool _show = true;
public void Show() {
_show = true;
}
public void Hide() {
_show = false;
}
}
要使其正常工作,必须将statehaschange()
添加到Show
和Hide
方法中。但是,如果我们将实现更改为包含RenderFragment
,则Show
和Hide
方法会神秘地开始工作
@if (_show) {
<h3>@ChildContent</h3>
}
@code {
private bool _show = true;
[Parameter] public RenderFragment ChildContent { get; set; }
public void Show() {
_show = true;
}
public void Hide() {
_show = false;
}
}
我怀疑Blazor在幕后以不同的方式注册了这个组件,因为RenderFragment
,在内部跟踪其状态,并在更新时自动触发statehaschange
这就引出了一个问题,在这种情况下,您实际上是使用StateHadChanged
方法来更新状态,还是在包含RenderFragment时依赖自动神奇维护的状态
有人知道吗。为什么会发生这种情况?二,。为了让它发挥作用,幕后到底发生了什么?我只是注意到这一点,我非常有条理地试图找出从一开始就触发更新的最佳方式,但从Blazor开始,它导致了一些混乱,因为如果不调用
statehaschange
,一些组件将正常工作,而其他组件则无法工作,这种行为有时看似随意,毫无道理。显然,现在开始理解为什么会发生这种情况了。当您有一个没有参数的组件时,渲染器将正确地假设没有任何更改,并且在渲染过程中不会因为单击按钮而重新渲染它
添加RenderFragment参数会强制Blazor进行手动渲染,因为它无法检测参数是否已更改
调用子组件的公共方法的实践是可疑的——如果您只包含一个参数,例如bool Hide
,并从父组件设置它,那么一切都会正常工作
@if (_show) {
<h3>@ChildContent</h3>
}
@code {
private bool _show = true;
[Parameter] public RenderFragment ChildContent { get; set; }
public void Show() {
_show = true;
}
public void Hide() {
_show = false;
}
}
<Test1Component @ref="_test1Component">Test1Component</Test1Component>
<button type="button" @onclick="(() => { if (_test1Component != null) _test1Component.Hide(); })">Hide Test</button>
<button type="button" @onclick="(() => { if (_test1Component != null) _test1Component.Show(); })">Show Test</button>
@code{
Test1Component _test1Component;
}