【发布时间】:2020-07-14 15:04:16
【问题描述】:
在 Blazor 中使用组件时,我经常需要子组件对参数更改值做出反应,并相应地做一些事情。
在一个简单的示例中,我在父组件和子组件之间链接了一个 UserId 参数。这个想法是,当父级更改 UserId 值时,子级中的属性设置器会调用一个读取所需数据的方法。这里有一些代码来说明。
我的父母:
<ChildComponent UserId="@UserId" />
<a onclick="@ChangeUser">Load User</a>
@code
{
public int UserId = 0;
void ChangeUser()
{
UserId = 1;
}
}
子组件:
@if(userDetails != null)
{
<div>First Name: @userDetails.FirstName</div>
<div>Surname: @userDetails.Surname</div>
}
@code
{
private int _userId;
[Parameter] public int UserId
{
get => _userId;
set
{
_userId = value;
LoadUserDetails();
}
}
UserDetails userDetails;
async Task LoadUserDetails()
{
userDetails = [read from server here];
StateHasChanged();
}
}
虽然这可行,但我不太喜欢 ChildComponent 中的属性设置器是同步的,但它正在调用异步代码 (LoadUserDetails)。
在父级中更新 UserId 并让子级意识到这一点并调用异步方法作为响应而不阻塞任何线程的最干净的方法是什么?
【问题讨论】:
-
覆盖 OnParametersSetAsync 以异步加载用户详细信息
-
@aguafrommars 但是如果有多个参数呢? OnParametersSetAsync 是否可以敏感到哪个参数发生了变化,以便调用相应的方法?
-
您可以通过在
UserIdsetter 中添加标志来检查属性是否发生变化 -
我无法想象这是如何工作的。
标签: blazor