0

我正在使用 razor 组件进行一些测试,但是在将属性从子组件更新到祖父组件时遇到了问题。

当子组件更新属性时,我正在使用 EventCallback 更新我的父组件。它适用于具有两个级别(ParentComponent/ChildComponent)的架构,但是它不适用于三个级别(GrandParentComponent/ParentComponent/ChildComponent)。

让我们以三个组件 A、B 和 C 为例。

- A (GrandParentComponent)
-- B (ParentComponent)
--- C (ChildComponent)
  • 更新 B 将触发 EventCallback 以更新 A
  • 更新 C 将触发 EventCallback 以更新 B,但是在此阶段 B 更新后不会触发 EventCallback,因此 A 组件仍然没有更新。

如何知道组件是否已被 EventCallback 更新。

我想知道,所以当来自 C 的 EventCallback 被触发时,我可以从 B 触发 EventCallback。是否有意义?:D

4

1 回答 1

0

如何知道 EventCallback 何时被触发?

定义一个事件委托,您可以在触发 EventCallback 时触发它......只是开玩笑。

你可以通过各种方式做到这一点。这是一个:

组件A.razor

<ComponentB ComponentBEvent="EventCallback.Factory.Create<string>(this, 
          mymethod)"></ComponentB>
<p>Message from Component A @message</p>

@code {
    private string message;

    private Task mymethod(string str)
   {
       message = str;
       return  Task.CompletedTask;
   }
}

组件B.razor

<ComponentC ComponentCEvent="EventCallback.Factory.Create<string>(this, 
                                                     mymethod)"></ComponentC>

<p>Message from Component B @message</p>

@code {
    string myvalue;
    [Parameter]
    public EventCallback<string> ComponentBEvent { get; set; }

    private string message;

    private async Task mymethod(string str)
    {
         message = str;

        if(ComponentBEvent.HasDelegate)
        {
           await ComponentBEvent.InvokeAsync(str);
        }
    }
 }

组件C.razor

<input type="text" value="@myvalue" @oninput="@((args) => { myvalue = 
   args.Value.ToString(); ComponentCEvent.InvokeAsync(args.Value.ToString()); 
})" />


<p>Message from Component C @myvalue</p>

@code {
     string myvalue;
     [Parameter]
     public EventCallback<string> ComponentCEvent { get; set; }
}

用法

<ComponentA />

注意:您可以使用采用状态模式的通知服务来实现此行为。此服务控制对象的状态、更新、删除等,并定义在操作发生时触发的事件,例如,在组件 A 中添加了一个员工对象,在这种情况下,通知服务通知所有相关方(订阅组件) 这个事实。

希望这可以帮助...

于 2020-03-12T17:17:28.030 回答