【发布时间】:2020-11-27 09:16:32
【问题描述】:
我正在使用 Blazor 服务器应用程序
我有一个控件,当使用@onclick 事件处理程序单击时,我想在单击事件方法中使用 NavigationManager 导航到新页面。 控件是什么并不重要(按钮、a、tr 等)它们都具有相同的行为
如果我在 HTML 中设置断点,我可以看到当前页面在进入新页面之前正在重新呈现。
重现此行为的一种简单方法是创建一个新的 blazor 项目并在 counter.razor 页面中 把代码改成这个
@page "/counter"
<h1>Counter</h1>
@if (1 == 1)
{
<p>Current count: @currentCount</p>
}
<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private void IncrementCount()
{
//currentCount++;
}
}
在 HTML 行“@if (1 == 1)”上放置一个断点 单击按钮时,它会调用不执行任何操作的单击事件(代码已注释掉),然后重新呈现页面并命中断点。 如果我在调用 navigationManager 的点击事件中添加代码以离开页面,也会发生同样的情况,当页面上没有任何更改时,它会在离开页面之前重新渲染。
添加 onclick:preventDefault 和/或 @onclick:stopPropagation 不会改变这一点
我发现唯一有效的方法是添加
private bool c_blnStopRendering = false;
protected override bool ShouldRender()
{
if (c_blnStopRendering == true) { return false; }
return base.ShouldRender();
}
并设置 c_blnStopRendering = true;在点击事件中 但这似乎太过分了,而且在需要的任何地方都需要手动添加它
【问题讨论】:
-
渲染应该是一个非常便宜的操作。你为什么要阻止它,它给你带来了什么问题?
-
嗨彼得,感谢您的回复。我想停止这种行为的主要原因是因为我有一个定制的网格组件,它有一个垂直滚动条,如果我向下滚动并单击底部附近的一个项目,就在页面离开之前它会重新渲染和一瞬间,您会看到网格重新绘制回顶部项目(不是我向下滚动的位置)。而且我想另一个原因是我读过它,我的印象是 Blazor 会扫描 DOM,并且只有在上次渲染发生变化时才重新渲染,在我的示例中,HTML 显然没有变化.
-
你的假设是正确的。 Blazor 构建渲染树,将其与之前的渲染树进行比较,并仅更新差异。可以复盘吗?这是您的实际问题。
-
感谢彼得的确认。该代码来自一个更大的项目,我没有时间制作一个更小的样本来重现该问题。在离开页面之前,滚动更改的重新渲染非常快,如果需要,我可以使用 ShouldRender 方法解决它。感谢您的帮助。