参数更改时的执行方法
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]
上执行。
您应该覆盖 OnParametersSet
或 OnParametersSetAsync
生命周期方法。
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;
}
}
给定一个 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]
上执行。
您应该覆盖 OnParametersSet
或 OnParametersSetAsync
生命周期方法。
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;
}
}