我很难理解什么时候应该调用 StateHasChanged()
以及Blazor何时拦截到某些内容已更改,因此必须重新呈现。
我创建了一个示例项目,其中包含一个按钮和一个名为AddItem的自定义组件。该组件包含一个带红色边框的div和一个按钮。
我的期望:我希望当用户单击Index页面中包含的按钮时,AddItem的div将显示出来。然后我想在用户单击AddItem的按钮时隐藏它。
注意: AddItem不会在外部公开其_isVisible
标志,而是包含一个Show()
方法。因此,在单击Index的按钮时,将调用AddItems.Show()
。
测试:
我单击了Index的点击按钮,然后调用了
Open()
和AddItem.Show()
方法。标志_isVisible
设置为true
,但没有任何操作,并调用了Index的ShouldRender()
方法。控制台输出:
- Render Index
我使用
public void Show() {_isVisible = true; StateHasChanged();}
修改了AddItem.Show()
。现在AddItem的div按预期显示和隐藏。控制台输出:
- Render AddItem (1° click on index's button)
- Render Index (1° click on index's button)
- Render AddItem (2° click on addItem's close button)
我使用
<AddItem @ref="AddItem" CloseEventCallback="CallBack" />
修改了<AddItem @ref="AddItem" />
,从AddItem的Show()
方法中删除了StateHasChanged
。现在AddItem的div按预期显示和隐藏。
基于测试3:如果将AddItem的
CloseEventCallback
设置为任何父级方法时,为什么不必显式调用StateHasChanged
? 我很难理解这一点,因为AddItem没有在任何地方调用CloseEventCallback
。
以及
Blazor何时理解某些内容已更改,因此必须重新呈现?
我的示例代码(如果你想试试)。
My Index.razor
<AddItem @ref="AddItem" />
<button @onclick="Open">click</button>
@code {
AddItem AddItem;
public void Open()
{
AddItem.Show();
}
public void CallBack()
{
}
protected override bool ShouldRender()
{
Console.WriteLine("Render INDEX");
return base.ShouldRender();
}
}
我的 AddItem 组件
@if (_visible)
{
<div style="width: 100px; height: 100px; border: 1px solid red">testo</div>
<button @onclick="Close">close</button>
}
@code {
private bool _visible = false;
[Parameter] public EventCallback<bool> CloseEventCallback { get; set; }
public void Show()
{
_visible = true;
}
public void Close()
{
_visible = false;
}
protected override bool ShouldRender()
{
Console.WriteLine("Render ADDITEM");
return base.ShouldRender();
}
}
当你调用CloseEventCallback[...]时,你期望它重新渲染
时,我同意你的观点,事实上我的问题很奇怪,只是为了了解Blazor引擎下正在发生什么。如果可能的话,我想问一下你从哪里获得这些信息:是在GitHub上查看asp.net Core Blazor吗?我正在尝试学习Blazor,并且我想了解更多关于“如何使用Blazor/可以做什么与Blazor”的内容之外的东西。你有任何建议吗?如果你在我的test 3测试中发现了任何问题,请告诉我。 - Leonardo Lurci