每次我与组件交互时,Blazor 都会设置组件参数
Blazor is setting component parameter every time I interact with component
我想要实现的是每次更新组件的参数值时调用一个函数,所以我创建了一个带有参数的组件并在其 setter 中调用一个方法,就像这样。
private LookupConfig _lookupConfig;
Parameter]
public LookupConfig Config { get { return _lookupConfig; } set { _lookupConfig = value; Console.WriteLine("Parameter Setter"); InitializeDropdownValues(); } }
在我的父组件中,我有一个 属性。
public LookupConfig CustomerDropdown = new LookupConfig { LookupType = LookupType.Customer };
然后我像这样将它传递给子组件。
<NeeleezAutoComplete Config="CustomerDropdown"/>
但每次我与参数 属性 的 NeeleezAutoComplete 组件 setter 交互时,都会调用配置。
我是不是遗漏了什么 blazor 参数的故意行为?以及如何实现此功能?
is it intentional behaviour of blazor parameters
是的,这是设计使然。 Blazor 非常轻微地跟踪参数变化。
解决方案似乎很简单:
set
{
if (_lookupConfig == value) return; // no change? Out of here.
_lookupConfig = value;
Console.WriteLine("Parameter Setter");
InitializeDropdownValues();
}
您可能想检查 LookupConfig 的相等性,但通常默认值就足够了。
我认为这段代码是不言自明的。
<h3>MyDiv</h3>
@code {
private bool veryBad;
private bool bad;
private bool good;
[Parameter] public bool VeryBad
{
get => this.veryBad;
set
{
this.veryBad = value;
// Do lots of stuff
}
}
[Parameter] public bool Bad
{
get => this.bad;
set
{
this.bad = value;
// Do something trivial
}
}
[Parameter] public bool Good { get; set; }
public override async Task SetParametersAsync(ParameterView parameters)
{
parameters.SetParameterProperties(this);
if (!this.good.Equals(this.Good))
{
// Do something
}
await base.SetParametersAsync(ParameterView.Empty);
}
}
关键是任何 [Parameter] 都应该(完全)像这样:
[Parameter] public bool Good { get; set; }
如果你想做一些检查,如果特定值发生变化,触发一些代码,....如果你需要立即使用它,请在 SetParametersAsync
中执行,或者在 OnParametersSet{async}
中执行,如果你没有。
通过在第一行中调用 parameters.SetParameterProperties(this);
来设置参数,释放渲染器以继续其工作(当它获得线程时间时)。请注意,我们使用空 ParameterView
调用基本方法,因为我们已经设置了它们。
将代码添加到 setter 意味着设置代码 运行 作为 parameters.SetParameterProperties
的一部分,可能会减慢整个 Renderer
过程。
我想要实现的是每次更新组件的参数值时调用一个函数,所以我创建了一个带有参数的组件并在其 setter 中调用一个方法,就像这样。
private LookupConfig _lookupConfig;
Parameter]
public LookupConfig Config { get { return _lookupConfig; } set { _lookupConfig = value; Console.WriteLine("Parameter Setter"); InitializeDropdownValues(); } }
在我的父组件中,我有一个 属性。
public LookupConfig CustomerDropdown = new LookupConfig { LookupType = LookupType.Customer };
然后我像这样将它传递给子组件。
<NeeleezAutoComplete Config="CustomerDropdown"/>
但每次我与参数 属性 的 NeeleezAutoComplete 组件 setter 交互时,都会调用配置。
我是不是遗漏了什么 blazor 参数的故意行为?以及如何实现此功能?
is it intentional behaviour of blazor parameters
是的,这是设计使然。 Blazor 非常轻微地跟踪参数变化。
解决方案似乎很简单:
set
{
if (_lookupConfig == value) return; // no change? Out of here.
_lookupConfig = value;
Console.WriteLine("Parameter Setter");
InitializeDropdownValues();
}
您可能想检查 LookupConfig 的相等性,但通常默认值就足够了。
我认为这段代码是不言自明的。
<h3>MyDiv</h3>
@code {
private bool veryBad;
private bool bad;
private bool good;
[Parameter] public bool VeryBad
{
get => this.veryBad;
set
{
this.veryBad = value;
// Do lots of stuff
}
}
[Parameter] public bool Bad
{
get => this.bad;
set
{
this.bad = value;
// Do something trivial
}
}
[Parameter] public bool Good { get; set; }
public override async Task SetParametersAsync(ParameterView parameters)
{
parameters.SetParameterProperties(this);
if (!this.good.Equals(this.Good))
{
// Do something
}
await base.SetParametersAsync(ParameterView.Empty);
}
}
关键是任何 [Parameter] 都应该(完全)像这样:
[Parameter] public bool Good { get; set; }
如果你想做一些检查,如果特定值发生变化,触发一些代码,....如果你需要立即使用它,请在 SetParametersAsync
中执行,或者在 OnParametersSet{async}
中执行,如果你没有。
通过在第一行中调用 parameters.SetParameterProperties(this);
来设置参数,释放渲染器以继续其工作(当它获得线程时间时)。请注意,我们使用空 ParameterView
调用基本方法,因为我们已经设置了它们。
将代码添加到 setter 意味着设置代码 运行 作为 parameters.SetParameterProperties
的一部分,可能会减慢整个 Renderer
过程。