【问题标题】:Blazor - subscribing to a property value changeBlazor - 订阅属性值更改
【发布时间】: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


【解决方案1】:
@code
{
   private int _userId;
   private bool _userIdChanged;
   
   [Parameter] public int UserId
   {
      get => _userId;
      set
      {
         _userIdChanged = value != _userId;
         _userId = value;
      }
   }
   UserDetails userDetails;
   
   async Task LoadUserDetails()
   {
      userDetails = [read from server here];
      StateHasChanged();
   }

    protected override async Task OnParametersSetAsync()
    {
         await base.OnParametersSetAsync().ConfigureAwait(false);
         if (_userIdChanged)
         {
             await LoadUserDetails().ConfigureAwait(false);
         }
    }
}

【讨论】:

  • 这里不需要 .ConfigureAwait() 并且可能有害。 [read from server here] 的线程安全性如何?
  • 我发现一个相当简单的规则和缺乏指定条件使其无用。 “除非其余代码需要上下文......”,那是什么时候?它也看起来相当过时。在 Blazor(和 WinForms、WPF、MVC)中,您几乎不需要 ConfigureAwait()。 StateHasChanged() 在另一个线程上无法正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 2019-09-19
  • 2023-02-04
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
相关资源
最近更新 更多