C# 为什么submit类型的按钮会在父组件中触发OnInit
有一个C# 为什么submit类型的按钮会在父组件中触发OnInit,c#,forms,components,eventemitter,blazor,C#,Forms,Components,Eventemitter,Blazor,有一个父组件和一个子组件,子组件有一个表单,表单有两个按钮,一个是提交,另一个是按钮。它们的onclick处理程序都调用操作,以便父组件做出响应。 在父组件中,处理从子组件发送的事件后,submit按钮触发的事件也会触发父组件上的OnInit。 为什么会发生这种情况 例如: 家长 <Child onsubmit=@((value)=>OnSubmit(value)) oncancel=@((value)=>OnCancel(value))></Chi
父组件和一个子组件,子组件有一个表单,表单有两个按钮,一个是提交
,另一个是按钮
。它们的onclick
处理程序都调用操作
,以便父组件做出响应。
在父组件中,处理从子组件发送的事件后,submit
按钮触发的事件也会触发父组件上的OnInit
。
为什么会发生这种情况
例如:
家长
<Child onsubmit=@((value)=>OnSubmit(value))
oncancel=@((value)=>OnCancel(value))></Child>
@functions()
{
private int x=3;
protected override void OnInit()
{
Console.WriteLine($"From OnInit ,x={this.x}");
}
protected override void OnAfterRender()
{
Console.WriteLine($"From AfterRender,x={this.x}");
}
protected void OnSubmit(int _x)
{
//lets say child sends x=7
this.x=_x;
Console.WriteLine($"From handler, x={this.x}");
}
protected void OnCancel(int _x)
{
//lets say child sends x=7
this.x=_x;
Console.WriteLine($"From handler, x={this.x}");
}
}
输出(用于按钮类型的按钮
)
为什么在父级处理事件后,父级上的submit
按钮也会触发OnInit
添加StateHasChanged();方法如下:
protected void OnEvent(int _x)
{
//lets say child sends x=7
this.x=_x;
// If this works, then it is a bug with Blazor...
// If not, be patient...
StateHasChanged();
Console.WriteLine($"From handler, x={this.x}");
}
如果页面刷新,则输出是正确的:每当重新加载页面时,就好像第一次运行它一样。现在,您应该了解页面刷新的原因。显示您的代码
对于您的另一个问题:在Blazor中重新呈现是由于事件(Blazor隐式调用StateHasChanged()或显式调用StateHasChanged()方法)而导致状态发生更改的组件发生的。重新渲染仅由受状态更改影响的组件完成,因此子组件可能会重新渲染,而其父组件则不会
编辑:从你下面所说的,我们现在知道为什么页面会被重新加载,
因此,每次单击submit按钮时,x的值都是3。
当然,当您单击另一个按钮时,父组件不会重新呈现,但正如我在上面已经演示的,如果您在OneEvent方法中添加对StateHasChanged()的调用,父组件将重新呈现,并且x变量将包含7
注意:您不应该使用类型属性设置为“提交”的按钮。Blazor是一个SPA框架。您不能通过提交表单(method=“post”)或将按钮的type属性设置为“submit”来发布表单数据。您应该改用Ajax(HttpClient)。据我所知,Blazor阻止表单提交:可能只有带有method=“post”和提交按钮的表单
希望这有助于。。。
如果我的答案对您有帮助,请将其标记为已接受这是正确的输出顺序吗?从Handler,x=7//在OnInit的eventhandler中,从OnAfterRender中,x=3,x=3是的,首先它正确分配,然后,页面刷新。当子标记关闭时,父
页面进行总刷新是否正常?根据条件@if
我应该说明我的子
是一个带有两个按钮的窗体:一个按钮类型为submit
,另一个按钮类型为button
。它们都会向父启动事件。按钮类型为的一个按钮不会触发父项
。
From Handler, x=7 //in parent eventhandler
From OnInit, x=3
From OnAfterRender, x=3
From Handler, x=7 //in parent eventhandler
From OnAfterRender, x=7
protected void OnEvent(int _x)
{
//lets say child sends x=7
this.x=_x;
// If this works, then it is a bug with Blazor...
// If not, be patient...
StateHasChanged();
Console.WriteLine($"From handler, x={this.x}");
}