Blazor组件生命周期方法OnParametersSet行为



我正在学习Blazor,并试图弄清楚组件生命周期方法是如何工作的。

在我的WASM项目中,我创建了一个简单的组件:

public class TestComponent : ComponentBase
{
[Parameter]
public string Id { get; set; }
[Parameter]
public RenderFragment ChildContent { get; set; }
protected override void OnParametersSet()
{
base.OnParametersSet();
Console.WriteLine($"({Id}) {nameof(OnParametersSet)}()");
}
protected override void BuildRenderTree(RenderTreeBuilder builder)
{
base.BuildRenderTree(builder);
Console.WriteLine($"({Id}) {nameof(BuildRenderTree)}()");
builder.AddContent(0, this.ChildContent);
}
}

并在页面上添加了该组件的2个实例:

<TestComponent Id="TestComponent1">
<input class="input" type="text" value="" />
</TestComponent>
<TestComponent Id="TestComponent2">
<input class="input" type="text" value="" @onchange="() => { }" />
</TestComponent>

现在,当页面加载时,我在浏览器控制台中看到这个日志:

blazor.webassembly.js:1 (TestComponent1) OnParametersSet()
blazor.webassembly.js:1 (TestComponent2) OnParametersSet()
blazor.webassembly.js:1 (TestComponent1) BuildRenderTree()
blazor.webassembly.js:1 (TestComponent2) BuildRenderTree()

这是在组件刚刚创建时所期望的。如果我更新TestComponent1值,则不会发生任何事情。

但如果我更新TestComponent2值,我会看到相同的日志。我想这是因为TestComponent2附加了事件处理程序,每次都会导致组件更新。我被以下问题所困扰:

  • 为什么更新TestComponent2值会触发TestComponent1的生命周期方法?它们是如何关联的?

  • OnParametersSet为什么被解雇?根据官方文件,这种方法应该被称为:

组件初始化后或父组件重新呈现时

这些都不是我的情况,IMO.

But if I update TestComponent2 value I see the same log.

当您更新TestComponent2的值时,会触发一个UI事件,并调用StateHasChanged方法来通知组件他的状态已经更改,并且应该重新呈现。当父组件重新渲染时,两个子组件都重新渲染:或当父组件再次渲染

您可以在父组件(OnAfterRender方法(中测试,每次更新TestComponent2的值时,父组件都会重新渲染。

注意:如果您放置一个";DoNothing";按钮而不是@onchange="() => { }",预期会出现相同的行为。

所有这些都与RenderFragment委托属性ChildContent的使用有关,没有它,两个子组件的这种重新呈现就不会发生。也就是说,如果您不在组件中使用子内容,则OnParametersSet将仅为状态已更改的子组件激发。

这里有一个链接到github的问题,与您的问题类似。。。

相关内容

  • 没有找到相关文章

最新更新