首页 > 解决方案 > Blazor 中是否有“OnParameterChanged”事件?

问题描述

当我的 Blazor 组件中的参数发生更改时,我想做一些事情。如果不是太多,我可以在二传手中完成。但是,如果我想做更多的事情,也许在后台线程中,我不能(不应该)在 setter 中做。

我知道 OnParameterSetAsync,但我怎么知道设置了什么参数?我可以让它工作(见下文),但想知道是否有更好的方法?

这是我的组件:

// ReactOnParameterUpdate.razor
<h2>@Message</h2>

@code
{
    [Parameter]
    public string Input { get; set; }

    protected string Message = "";
    private string _previousInput = null;

    protected override async Task OnParametersSetAsync()
    {
        if (_previousInput != Input)
        {
            _previousInput = Input;
            await SomeAsyncMethod();
        }
    }

    private async Task SomeAsyncMethod()
    {
        Message = $"Async method was called at {DateTime.Now}";
        await Task.CompletedTask;
    }
}

并且这里使用了该组件:

// Index.razor
@page "/"

<div class="input-group mb-3">
    <div class="input-group-prepend">
        <span class="input-group-text">Input:</span>
    </div>
    <input type="text" class="form-control" @bind="@Input">
</div>

<ReactOnParameterUpdate Input=@Input></ReactOnParameterUpdate>

@code
{
    protected string Input;
}

编辑:根据下面的建议和完整性,这里是如何使用 SetParametersAsync:

    public override async Task SetParametersAsync(ParameterView parameters)
    {
        foreach (var param in parameters)
        {
            if (param.Name == nameof(Input) && (string)param.Value != Input)
            {
                await SomeAsyncMethod();
            }
        }
        await base.SetParametersAsync(parameters);
    }

标签: blazor

解决方案


您可以使用循环查看已更改的属性。希望这可以帮助。

@code {

    [Parameter]
    public Foo Foo { get; set; }

    public override async Task SetParametersAsync(ParameterView parameters)
    {
        foreach(var prm in parameters)
        {
            Console.WriteLine($"Name: {prm.Name}");
            Console.WriteLine($"Value: {prm.Value?.ToString()}");
        }

        await base.SetParametersAsync(parameters);
    }
}

推荐阅读