Minha página Blazor (.NET 8) possui uma lista de componentes gerados, um para cada linha em uma resposta de consulta de banco de dados:
@foreach (var item in _listOfItems)
{
<CollapsibleCard Title="item.CardTitle">
other contest based on item..
</CollapsibleCard>
}
onde CollapsibleCard
está um componente que fiz que envolve Bootstrap card
, adicionando um botão recolher/expandir, e o estado recolhido/expandido é gerenciado usando o código Blazor (ou seja, não no nível Javascript).
Gostaria de ter um botão na página que recolhesse ou expandisse todos os cartões de uma vez. O componente possui um método para recolhê-lo ou expandi-lo. Qual código posso colocar no onclick
manipulador para que o botão passe por todos esses cartões?
Para um número fixo de cartões, eu poderia usar @ref
a definição de cada um, mas não tenho certeza de como isso funcionaria neste cenário em que poderia haver qualquer número de componentes.
Nota. Eu já tentei ter um parâmetro para o estado expandido/recolhido, mas geralmente descobri que essa abordagem não funciona: o compilador emite avisos se você tentar modificar o valor de um parâmetro de dentro do componente (como aconteceria quando o usuário clica em o botão no cartão para expandi-lo), e alterar o valor do parâmetro de fora do componente não faz nada, pois o componente não sabe como se renderizar novamente, você teria que iterar sobre os componentes para re- renderize-os de qualquer maneira ou renderize novamente a página inteira.
Você precisa usar um objeto de estado em cascata com um evento. Usar
@ref
não é o caminho a percorrer. Este é um padrão de notificação comum usado no Blazor. Se você pesquisar no SO por "Blazor Notification Pattern" encontrará diversas respostas sobre o assunto.Você pode colocar em cascata o objeto de estado para um contexto de nível de formulário ou registrá-lo como um serviço com escopo definido para um contexto de nível de sessão SPA .
Aqui está uma demonstração rápida e suja.
Um cartão muito simples
E página de demonstração