【发布时间】:2022-08-14 15:58:59
【问题描述】:
我在编写 Blazor 服务器组件时遇到了一些问题。我有一个在同一页面上多次使用的自定义组件。当任何一个组件的属性发生更改时,两个组件都会重新渲染/更新(如果在组件中使用了RenderFragment)。为什么是这样?如何修复它,以便只有正确组件上的属性才呈现该组件的更新,而不更新所有其他组件?
这只发生在使用RenderFragment 时。从组件中删除 RenderFragment 和 @ChildContent 可解决此问题。
我创建了一个简单的示例来演示该问题。
page.razor
@page \"/\"
<div>
<button @onclick=\"OnClick_Update_1\">Update 1</button>
<button @onclick=\"OnClick_Update_2\">Update 2</button>
</div>
<h3>Component 1</h3>
<MyComponent PlayNice=\"DoUpdate_1\">ABC</MyComponent>
<h3>Component 2</h3>
<MyComponent PlayNice=\"DoUpdate_2\">DEF</MyComponent>
@code{
private bool DoUpdate_1 { get; set; } = false;
private bool DoUpdate_2 { get; set; } = false;
private void OnClick_Update_1(){
DoUpdate_1 = true;
}
private void OnClick_Update_2() {
DoUpdate_2 = true;
}
}
MyComponent.razor
<p class=\"@_class\">@ChildContent - @DateTime.UtcNow</p>
@code {
[Parameter] public bool PlayNice { get; set; } = false;
[Parameter] public RenderFragment ChildContent { get; set; } = default!;
private string _class { get; set; } = default!;
protected override void OnParametersSet() {
_class = string.Empty;
if (PlayNice)
_class += \"abcdef\";
base.OnParametersSet();
}
}
此处提供了一个工作示例:https://blazorfiddle.com/s/facmehiz (交替单击按钮 - 两个组件都将更新)
没有 RenderFragment 的示例:https://blazorfiddle.com/s/0w11bbxw (是我想要的结果,但我想用一个RenderFragment)
谢谢你。