C# Blazor-比较上一个状态和下一个状态

C# Blazor-比较上一个状态和下一个状态,c#,signalr,blazor,blazor-server-side,C#,Signalr,Blazor,Blazor Server Side,我有一个Blazor中的学生表,它来自一个api,我还收到一个推送数据来更新学生信息,这基本上是数据库更改后的分数,推送工作正常,分数正在更新,但我还想将表中已更新字段的背景颜色更改为红色,仅td标记几秒钟,我的代码如下: @foreach(var student in SS.GetStudents()){ <tr> <td> student.name </> <td> student.sectio

我有一个Blazor中的学生表,它来自一个api,我还收到一个推送数据来更新学生信息,这基本上是数据库更改后的分数,推送工作正常,分数正在更新,但我还想将表中已更新字段的背景颜色更改为红色,仅td标记几秒钟,我的代码如下:

@foreach(var student in SS.GetStudents()){
     <tr>
          <td> student.name </>
          <td> student.section </>
          // trying to compare between the previous and next state
          var stud = SS.GetStuentsCopy().SingleOrDefault(s =>s.Id == student.Id);
          var color = "";
          if(stud.score != student.score){
            color = red;
           }
          <td class="@color"> student.score </>
     </tr>
  }

   @code{
         [Inject]
         public StudentsStates SS { get; set;}
         public StudentsResponse Students { get; set; }
         protected override async Task OnInitializedAsync()
         { 
              // Subscribe to the StateChanged EventHandler
               SS.StateChanged +=
               SSAdvancedStateChanged;

          Students = await Service.GetStudents();
         // update the students and the copy together
          SS.UpdateStudents(Students)
          SS.UpdateStudentsCopy(Students)


       //upon receiving students updated score
                hubConnection = new HubConnectionBuilder()
        .WithUrl(NavigationManager.ToAbsoluteUri("/studhub"))
        .Build();

        hubConnection.On<StudentsResponse>("ReceiveMessage", s =>
        {
            // update the students after 3 sec update the copy
            SS.UpdateStudents(s);


           //Here the state is not being updated
           // unless there is a new push 
           // or the issue might be in rendering
           // FYI without the sleep also I can see the changes in the color
            System.Threading.Thread.Sleep(3000);
            SS.UpdateStudentsCopy(s);

        }

      }}

正如我上面所说的,一切正常,除了在一秒钟内有多次推送,第一次推送的学生分数的背景颜色变化太快,有时你甚至不会注意到它,因为推送的数据和状态正在更新,我想要的是在不影响下一次推送的学生分数的情况下减慢背景颜色,或者如果有更好的方法来解决这个问题,我们非常感谢您的回答。

我建议为学生行创建一个组件,如下所示:

@foreach(var student in SS.GetStudents())
{
      <StudentRow Student={student} />
}
@foreach(SS.GetStudents()中的var student)
{
}
然后在StudentRow组件中,您可以创建一个新的私有student变量,在延迟3秒后更新该变量,并在那里进行比较,而不是将ID保存在列表或其他副本中:

学生剃须刀

  <tr>
      <td> Student.name </>
      <td> Student.section </>
      var color = "";
      if(StudentCopy.score != Student.score){
        color = red;
       }
      <td class="@color"> student.score </>
 </tr>
 @code{
         public StudentResponse StudentCopy { get; set; }
         [Parameter]
         public StudentResponse Student { get; set; }

         protected override async Task OnParametersSetAsync()
         {
          await Task.Delay(3000);
          StudentCopy = Student;

         }
      }

学生姓名
学生部
var color=“”;
if(StudentCopy.score!=Student.score){
颜色=红色;
}
学生成绩
@代码{
公共学生响应学生副本{get;set;}
[参数]
公共学生响应学生{get;set;}
受保护的重写异步任务OnParametersSetAsync()
{
等待任务。延迟(3000);
StudentCopy=学生;
}
}
OnParametersSetAsync方法,当组件从渲染树中的父组件接收到参数,并且传入的值已分配给属性时调用

  <tr>
      <td> Student.name </>
      <td> Student.section </>
      var color = "";
      if(StudentCopy.score != Student.score){
        color = red;
       }
      <td class="@color"> student.score </>
 </tr>
 @code{
         public StudentResponse StudentCopy { get; set; }
         [Parameter]
         public StudentResponse Student { get; set; }

         protected override async Task OnParametersSetAsync()
         {
          await Task.Delay(3000);
          StudentCopy = Student;

         }
      }