c# - StateHasChanged 用于特定组件,而不是重新渲染页面中的所有组件

标签 c# blazor

我正在使用多个组件是我的应用程序每个都以有条件的方式呈现。是否有可能单独重新渲染特定组件?
MyRazor.razor 文件,

 <button @onclick="Chnage">Second</button>
<div>
    @if (renderOne)
    {
        var data1 = Count++;
        <ComponentFirst>@data1</ComponentFirst>
    }
    @if (renderTwo)
    {
        var data2 = Count2++;
        <ComponentSecond class="btn-danger">@data2</ComponentSecond>
     }
</div>
@code { 
    void Chnage()
    {
        renderOne = true;
    }
}
ComponentFirst 和 ComponentSecond 通过各自的 bool 值检查来呈现。在按钮单击中,我单独启用了 CompoenentFirst。但是 ComponentSecond 也再次渲染。我的目标是如果我单独启用 renderOne ComponentFirst 应该再次渲染。如果我禁用 renderTwo ComponentTwo 应该再次渲染,而不是渲染两个组件以在应用程序中进行一次更改。

最佳答案

您可能不应该担心组件渲染很多次。渲染只构建一个渲染树,它不会更新浏览器的 DOM。只有在构建了整个页面的渲染树后,Blazor 才会将其与最后一个渲染树进行比较,然后从差异中更新 DOM。
话说回来:
如果父组件通过 [Parameter] 将任何信息传递给子组件属性(包括 RenderFragment ),那么每当父组件重新渲染时,子组件也将重新渲染,以防万一发生任何变化。
如果您希望组件独立于其父组件重新渲染,那么您不应将任何状态传递给它们。您可以通过将状态存储在组件之外来实现这一点。例如

public class MyState
{
  public int Count1 { get; set; }
  public int Count2 { get; set; }

  public event EventHandler<EventArgs> Changed;
  public void NotifyChanged() => Changed?.Invoke(this, EventArgs.Empty);
}
如果您将其注册为可注入(inject)依赖项,则可以直接在子组件中使用它
@inject MyState State
@implements IDisposable

<div>
  The value is @State.Count1
</div>

@code
{
  protected override void OnInitialized()
  {
    State.Changed += DoUpdate;
  }

  void IDisposable.Dispose()
  {
    State.Changed -= DoUpdate; // Important1
  }

  private void DoUpdate(object sender, EventArgs e)
  {
    InvokeAsync(StateHasChanged);
  }
}

任何组件都可以通过注入(inject) MyState 来更新状态然后做
injectedState.Counter1++;
injectedState.Counter2--;
injectedState.NotifyChanged();

关于c# - StateHasChanged 用于特定组件,而不是重新渲染页面中的所有组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62996874/

相关文章:

asp.net - 在Docker中托管Razor组件的建议

c# - 将 UI 和 API 组合到单个 Blazor 服务器应用程序中?

blazor - 如何在 Blazor 的输入组件内有条件地防止默认?

c# - 为什么我得到 ImageSharp 不支持同步读取?

c# - 对 DTO 的 ASP.NET WebApi OData 支持

c# - 将图像添加到 ASP.Net 中的单选按钮列表

c# - 计算数据库中检索到的行

c# - 有没有办法在不统一使用 Update() 函数的情况下从按钮单击启动方法

c# - 如何在 Blazor 服务器端的 CircuitHandler 中调用方法?

c# - 什么会导致 Dapper cast 失败?