每次我与组件交互时,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 过程。