es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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();
}

Tags:  , , ,

Answer

  1. Avatar for 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:

    @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("¡Detalles de Wiki recuperados!");
        }
    
        private void StateHasChanged()
        {
            wikiDetail = AppState.CurrentWikiPage;
            UpdateChildComponent();
        }
    
        private void UpdateChildComponent()
        {
            // Llamar al método de devolución de llamada en el componente hijo
        }
    }
    

    En el componente hijo:

    @code {
        [Parameter]
        public Action UpdateCallback { get; set; }
    
        protected override void OnInitialized()
        {
            UpdateCallback?.Invoke();
        }
    }
    

Comments are closed.