【发布时间】:2020-05-22 13:30:12
【问题描述】:
我很难理解何时应该调用 StateHasChanged() 以及何时 Blazor 拦截到某些内容已更改,因此必须重新渲染。
我创建了一个示例项目,其中包含一个按钮和一个名为 AddItem 的自定义组件。该组件包含一个带有红色边框的 div 和一个按钮。
我的预期:我希望 AddItem 的 div 在用户单击索引页面中包含的按钮时显示出来。然后我想在用户单击 AddItem 的按钮时隐藏它。
注意: AddItem 不会在外部公开_isVisible 标志,而是包含Show() 方法。所以AddItems.Show()会在索引按钮被点击时被调用。
测试:
-
我单击 Index 的单击按钮,然后调用方法
Open()和AddItem.Show()。标志_isVisible设置为true,但没有任何反应,并且调用了Index 的ShouldRender()。控制台输出:
- 渲染索引
-
我已将
AddItem.Show()修改为public void Show() {_isVisible = true; StateHasChanged();}。现在 AddItem 的 div 按预期显示和隐藏。控制台输出:
- 渲染 AddItem(1° 点击索引按钮)
- 渲染索引(1° 点击索引按钮)
- 渲染 AddItem(2° 点击 addItem 的关闭按钮)
我已经用
<AddItem @ref="AddItem" CloseEventCallback="CallBack" />修改了<AddItem @ref="AddItem" />,从 AddItem 的Show()方法中删除了StateHasChanged。现在 AddItem 的 div 按预期显示和隐藏。
基于测试 3: 如果我将 AddItem 的
CloseEventCallback设置为任何父母的方法,为什么我不必显式StateHasChanged?我很难理解它,因为 AddItem 不会在任何地方调用CloseEventCallback。
和
当 Blazor 了解某些内容已更改,因此必须重新渲染时?
我的示例代码(如果你想试试的话)。
我的索引.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();
}
}
【问题讨论】:
标签: blazor