Blazor 将数据从父级传递给子级

Ahm*_*mam 5 .net c# asp.net razor blazor

我有一个 razor 页面,它依赖于它的父类和一个有自己的类并从其父类接收数据的第二个孩子,我的问题是对 api 的第二次调用,数据没有传递给第二个孩子,当其父项更改其数据时,第二个子项不会被渲染,但它可以在第一个渲染器上工作并且正在传递数据。

Parent.razor

@inherits ParentBase;

<FirstChild/>
<SecondChild data="@data"/>
Run Code Online (Sandbox Code Playgroud)

FirstChild.razor

@inherits ParentBase;

// call its parent method
<span  @onclick='(() => callApi())'/> 
Run Code Online (Sandbox Code Playgroud)

父数据库

public class ParentBase : ComponentBase
{
   public Data data { get; set; }
   protected override async Task OnInitializedAsync()
   {
       data = await Services.GetData();
   }
   // call from a child
   public void callApi
   {
     data = await Services.GetData();
   }
}
Run Code Online (Sandbox Code Playgroud)

SecondChild.razor

<Table data="@data"/>
Run Code Online (Sandbox Code Playgroud)

SecondChildBase.cs

public class SecondChildBase : ComponentBase
{
   [Parameter]
   public Data data { get; set; }

   protected override void OnParametersSet()
   {
       // this is not getting called
       StateHasChanged();
       Console.WriteLine(data);
   }
}
Run Code Online (Sandbox Code Playgroud)

Ven*_*sky 5

仅仅因为Parent.razorFirstChild.razor继承自同一个类,并不意味着两个类(public Data data { get; set; })的数据在更改时将具有相同的值。

当您调用callApiFirstChild,它会更改它自己的data,如果您想更改父级的data,您需要传递一个参数,FirstChild该参数将是单击时调用的函数span,该Parent函数将调用 的callApi

FirstChild.剃刀

<span @onclick="OnClick">Call Parent function</span>

@code 
{
    // Call this EventCallback when the span is clicked
    [Parameter]
    public EventCallback OnClick { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

家长剃刀

@inherits ParentBase;

@* Passing OnClick Parameter to call callApi*@
<FirstChild OnClick="@callApi" />
<SecondChild data="@data" />
Run Code Online (Sandbox Code Playgroud)

  • @AhmedImam如果您希望多个子组件访问该函数并且不想将参数传递给所有子组件,您可以使用“CascadingValue”或创建看起来像“服务”的东西。如果您想了解更多信息,请阅读这篇[文章](https://chrissainty.com/3-ways-to-communicate- Between-components-in-blazor/) (2认同)