gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:26:25 25 4
gpt4 key购买 nike

我正在使用多个组件是我的应用程序每个都以有条件的方式呈现。是否有可能单独重新渲染特定组件?
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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com