StateHasChanged在Blazor的目标



看看这个非常基本的组件:

<div>
@param1
<button @onclick="@btn_on_click">Cliquez là</button>
</div>
@code
{
[Parameter]
public int param1 { get; set; }
[Parameter]
public Action<int> on_evt_test_fire { get; set; }
void btn_on_click()
{
param1 += 1;
this.on_evt_test_fire(param1);
}
}

看看这个非常基本的页面:

@message
<button @onclick="@on_btn_click">Click me</button>
<MyComponent param1="1"  on_evt_test_fire="@on_evt" />
<MyComponent param1="2" on_evt_test_fire="@on_evt" />
@code 
{
private String message = "";
private void on_evt(int param_evt)
{
message = "Button clicked inside component";
StateHasChanged();
}
private async Task on_btn_click()
{
message = "Button clicked in this page";
}
}

我对StateHasChanged((有问题。

  • 我的第一个问题是:为什么我应该在on_evt中调用StateHasChanged,而在on_btn_click中则没有必要。这两种方法之间的唯一区别是第一种方法是从组件内部调用的。在这种特定情况下,我为什么要调用StateHasChanged?

  • 当我调用StateHasChanged((时,这两个组件被重置:它们取其初始值。。。

感谢的帮助

而在on_btn_click 中没有必要

在on_btn_click上没有必要,因为StateHasChanged方法是在UI事件上自动调用的。

[Parameter]
public Action<int> on_evt_test_fire { get; set; }

您不应该使用Action委托。改为使用EventCallback"delegate",如下所示:

注意:当您使用Action委托时,事件的目标是当前组件(子组件(,但当您使用EventCallback时,目标是父组件,这就是为什么您不需要添加对StateHasChanged方法的调用。在发现EventCallback之前,我们必须调用StateHasChanged方法。那是很久以前的事了。。。

[Parameter]
public EventCallback<int> on_evt_test_fire { get; set; }

你应该这样称呼它:

public async Task btn_on_click()
{
if( on_evt_test_fire.HasDelegate)
{
temp++;
await on_evt_test_fire.InvokeAsync(temp);
}
}

您不应该使用param1参数来增加其值。定义一个新变量,并在OnInitialized方法类似这个:

protected override void OnInitialized()
{
temp = param1;
}

当我调用StateHasChanged((时,这两个组件被重置:它们取其初始值。。

-

不要创建写入自己参数属性的组件在以下情况下,参数被覆盖:

  • 使用RenderFragment渲染子组件的内容。

  • StateHasChanged是在父组件中调用的。参数被重置是因为父组件在调用StateHasChanged时重新发送,并且新的参数值被提供给子组件。

此处来源:

点击此处查看更多信息:

我相信@onClick回调会由于一些隐藏的逻辑而强制子级重新渲染。当您的回调或事件被分配给按钮的@onClick时,很可能会被添加到onClick内部所做的事情列表中。对此持怀疑态度,这只是我的理论。

编辑:你的参数被重置是因为setState((迫使你的父母从头开始用硬编码的"1"one_answers"2"重新渲染。当事件触发点击按钮时,我相信它会在组件内部设置状态,从而保留数据。加盐。

@Henk和@SilenceAmongCrows的答案都是正确的。需要补充的一点是,在您的子组件中,如果您使用EventCallBack<T>而不是Action<T>,并且将子组件中的param1属性绑定到父组件的@code块中的属性,Blazor引擎将更好地跟踪刷新内容以及何时刷新。

相关内容

  • 没有找到相关文章

最新更新