I'm trying to create a tabbed component that can hold components that are unknown a build time.
But I can't figure out how to keep the state of that component when it's not shown. I would like to create the component data in an array of objects, then depending on the shown tab, load that stored class as a render fragment.
A simplified example below hopefully detailing what I'm trying to do:
Test1.razor:
<h4>Type: Test1</h4><button @onclick="()=>{count++;}">Inc</button>Count: @count<br />RandomCount: @ManualSet@code{ private int count = 0; public int ManualSet { get; set; }}Test2.razor:
<h4>Type: Test2</h4><button @onclick="()=>{count++;}">Inc</button>Count: @count<br />RandomCount: @ManualSet@code{ private int count = 0; public int ManualSet { get; set; }}Test3.razor:
<h4>Type: Test3</h4><button @onclick="()=>{count++;}">Inc</button>Count: @count<br />RandomCount: @ManualSet@code{ private int count = 0; public int ManualSet { get; set; }}index.razor
@page "/"<PageTitle>Index</PageTitle><p role="status">Current count: @activeIndex</p><p><button class="btn btn-primary" @onclick="ChangeIndex">Click me</button></p><div> @frags[activeIndex]</div>@code{ int activeIndex = 0; List<RenderFragment> frags = new List<RenderFragment>(); List<IComponent> comps = new List<IComponent>(); void ChangeIndex() { if (activeIndex < frags.Count() - 1) { activeIndex++; } else { activeIndex = 0; } } Random rnd = new Random(); (IComponent,RenderFragment) getRandom(int randomCount) { switch (rnd.Next(0, 3)) { case 0: { var b = new Test1(); b.ManualSet = randomCount; RenderFragment c = (@<Test1 @ref=b />); // "Ref b" is not using data from object b as as expected return (b, c); } case 1: { var b = new Test2(); b.ManualSet = randomCount; RenderFragment c = (@<Test2 @ref=b />); return (b, c); } case 2: { var b = new Test3(); b.ManualSet = randomCount; RenderFragment c = (@<Test3 @ref=b />); return (b, c); } } throw new Exception("no return"); } protected override async Task OnInitializedAsync() { for(int i = 0;i < 10; i++) { var random = getRandom(i); comps.Add(random.Item1); frags.Add(random.Item2); } }}BlazorFiddle: https://blazorfiddle.com/s/lajku15f
Results I'm looking for
Each component has it's ManualSet variable set to it's index id.
When modifying count using the Inc button, the count is retained, even when toggling through the items in the array.
What I'm getting
@ref doesn't seem to be relating to the object created by getRandom and stored within comps list.
ManualSet is 0
count is reset each time the RenderFragment changes. Meaning it works as you would expect if I didn't have @ref set and a new instance is created each time.