【问题标题】:How do I stop blazor @onclick re-rendering page如何停止 blazor @onclick 重新渲染页面
【发布时间】: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 方法解决它。感谢您的帮助。

标签: .net-core onclick blazor


【解决方案1】:

这是目前唯一的方法。积压中有请求https://github.com/dotnet/aspnetcore/issues/18919

【讨论】:

    【解决方案2】:

    我想知道你是怎么做到的。我遇到了完全相同的问题(我只想 NavigateTo 而不进行任何重新渲染)。覆盖 ShouldRender 以返回 false,停止一切 - 即它没有 NavigateTo URL。然而,我正在导航到同一页面,但在 QS 中使用不同的参数。当我在 NavigateTo 方法(public void NavigateTo(string uri, bool forceLoad = false);)中发现一个可选参数时,我似乎已经解决了这个问题(我认为!)。我将其设置为 true,现在似乎没问题。只是对您的体验感兴趣

    【讨论】:

    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
    猜你喜欢
    • 1970-01-01
    • 2013-08-06
    • 2020-04-24
    • 2017-03-20
    • 2018-07-20
    • 1970-01-01
    • 2023-03-04
    • 2021-11-21
    • 2019-04-18
    相关资源
    最近更新 更多