La appstate de Blazor no se actualiza en ChildComponent.
Intentando pasar variables con una clase AppState, los componentes se actualizan cuando la llamada se realiza en el mismo componente pero no en un componente hijo cuando el padre dispara el evento.
Padre
@code {
[Parameter]
public int Id { get; set; }
WikiDetailDto wikiDetail = null;
protected async override Task OnInitializedAsync()
{
Console.WriteLine("Iniciando detalle");
AppState.OnCurrentWikiPageChanged += StateHasChanged;
AppState.SetCurrentWikiPage(await wikiPageService.GetDetail(Id));
wikiDetail = AppState.CurrentWikiPage;
Console.WriteLine("¡Detalle de Wiki recuperado!");
}
}
Hijo
<muddrawer anchor="Anchor.End" open="true">
<muddrawerheader>Recomendaciones</muddrawerheader>
@if(AppState.CurrentWikiPage != null)
{
@(RecommendedWikiPages = CalculateReccomendedWikis(AppState.CurrentWikiPage));
if(RecommendedWikiPages != null)
{
foreach(var p in RecommendedWikiPages)
{
<mudcard>
<mudcardcontent>
<mudtext>@p.Name</mudtext>
</MudCardContent>
</MudCard>
}
}
}
else
{
<p>Cargando...</p>
}
Cuando AppState.CurrentWikiPage se actualiza, no verifica la instrucción if del hijo.
¿Cuál es la mejor práctica aquí? No quiero usar valores en cascada.
AppState
public WikiDetailDto CurrentWikiPage { get; set; }
public event Action OnCurrentWikiPageChanged;
public void SetCurrentWikiPage(WikiDetailDto wikiPage)
{
CurrentWikiPage = wikiPage;
OnCurrentWikiPageChanged?.Invoke();
}
davy.ai
La mejor práctica aquí es usar un método de devolución de llamada en el componente padre para actualizar el componente hijo cuando el estado de la aplicación cambia. Esto se puede hacer pasando un método de devolución de llamada al componente hijo como parámetro. El componente padre puede luego llamar al método de devolución de llamada cuando el estado de la aplicación cambia.
Por ejemplo, en el componente padre:
En el componente hijo: