参数更改时的执行方法

Executing method on Parameter change

给定一个 child 和一个 parent 组件,我试图在 parameter 发生变化时在 child 中执行一个方法(从 parent).

Parent

<Child value=@IsChanged></Child>

<button onclick="Update"></button>

@functions(){
  public bool IsChanged{get;set;}
  public void Update()
  {
   this.IsChanged!=this.IsChanged;
  }

Child

@(value?"True":"False")
@functions()
{
  [Parameter]
  protected bool value {get;set;}
  
  public void SideEffect()
  {
    Console.WriteLine("has changed"); //i want this method executed when value changes from parent
  }

如您所见,我需要执行 Child 中的方法 parameter.The 参数的 onchange 在 parent 中更改。

P.S
我查看了 onchange 事件处理程序,但我需要在 [Parameter] 上执行。

您应该覆盖 OnParametersSetOnParametersSetAsync 生命周期方法。

Child

@(_value ? "True" : "False")

@code()
{
  private bool _value;

  [Parameter] public bool Value { get; set; }

  protected override void OnInitialized()
  {
      _value = Value;
  }

  protected override void OnParametersSet()
  {
      if (_value != Value)
      {
          _value = Value;
          Console.WriteLine("a parameter has changed");
      }
  }
}

这是解决您的问题的最好、最简单的方法

Child.razor

    @( _Value ? "True" : "False")


<div>@message</div>

@code
{
    [Parameter]
    public bool Value { get;set; }
  // [Parameter]
  //  public EventCallback<bool> ValueChanged { get;set; }

    private bool _value;
    private bool _Value
    {
        get => _value;
        set 
        {
            if ( _value != value)
            {
                _value = value;
                SideEffect();
              //  ValueChanged.InvokeAsync(_value);        
            }
        }
    }

    private string message;

    public void SideEffect()
    {
       message = $"Parameter has changed: {_Value}"; //i want this method executed when value changes from parent
     
    }

    protected override void OnParametersSet()
    {
            if (_Value != Value)
            {
                _Value = Value;
            }
    }
 }

用法

@page "/"

<Child Value="IsChanged" />

<button type="button" @onclick="Update">Update</button>

<div>IsChanged: @IsChanged</div>

@code
{
   private bool IsChanged { get; set; } = true;

   public void Update()
   {
      IsChanged = !IsChanged;
   }
}