Teniendo en cuenta que tengo una clase llamada Tab .
public class Tab { public Guid Id { get; } public bool IsVisible { get; set; } protected Tab() { Id = Guid.NewGuid(); } }Quiero acoplar estrictamente estas pestañas a una instancia de Blazor Component y representar esas instancias iterando sobre las pestañas. Quiero tener control sobre cuándo se crea un Componente y cuándo se destruye nuevamente.
Quiero hacer esto porque de esa manera puedo conservar el estado de cada componente.
Aquí está el problema con el enfoque fácil. Teniendo en cuenta algo como esto:
@code { public void CreateNewTabAndRemoveOldTab() { Tabs.RemoveAt(0); Tabs.Add(new Tab()); } } foreach (var tab in Tabs) { <MyTabComponent/> } La pestaña recién creada simplemente asumirá el estado de la pestaña eliminada. No se llamará a OnInitialized .
He RenderFragment , pero no parece su propiedad de trabajo. El problema es que Blazor Framework seguirá decidiendo cuándo se crea un nuevo componente (llamando así a OnInitialized ) o cuándo se usa una instancia existente.
Si leí esto correctamente, Tab es una clase, no un componente. Debe desacoplar su lista de pestañas del componente que las representa. Su lista de pestañas vive en un servicio, el alcance depende de lo que esté haciendo con ellas. Su componente de pestaña muestra la pestaña actualmente seleccionada en la lista. Si muestra un poco más de su lógica, probablemente pueda mostrarle un ejemplo de trabajo relevante.
Mira esto
@ref es una referencia a su componente, se agrega a la lista de componentes.
@implements IDisposable @foreach (var tab in tabs) { <MyTabComponent @ref=@TabRef Tab=@tab /> } @code { List<Tab> tabs = new List<Tab>(); List<MyTabComponent> tabsComp = new List<MyTabComponent>(); MyTabComponent TabRef { set { tabsComp.Add(value); } } public void CreateNewTabAndRemoveOldTab() { tabs.RemoveAt(0); tabs.Add(new Tab()); } public void Dispose() { } }MisTabs.razor
<CascadingValue Value="@this" IsFixed="true"> foreach (var tab in Tabs) { <MyTabComponent/> } </CascadingValue> @code{ private List<MyTabComponent> Tabs; public void Register(MyTabComponent tab) { this.Tabs.Add(tab); } public void UnRegister(MyTabComponent tab) { this.Tabs.Remove(tab); } }MiTabComponent.razor
@implements IDisposable <div></div> @code{ [CascadingParameter] protected MyTabs Context { get; set; } protected override void OnInitialized() { Context?.Register(this); // implement your logic here } public void Dispose() { Context?.UnRegister(this); // implement your logic here } }