Blazor循环调用子组件时参数不更新问题求助
Blazor循环中子组件参数未正确更新问题解决
我正在学习Blazor,尝试向自定义子组件传递两个参数,但遇到循环调用时子组件的Assignment参数未正确更新的问题。目前Tactical参数为硬编码值,我先尝试让Assignment参数正常工作。循环中每次调用本应创建新组件并传入不同的Assignment值,但实际组件显示的第二个参数未变化,而页面上直接输出的@b是正确的。

子组件(UnitComponent.razor)代码
<div class="card" style="width: 4rem;"> @* <img class="card-img-top" src="@imageUrl" alt="Unit x" /> *@ <div class="card-body"> <h6 class="card-title">@Tactical</h6> <p class="card-text">@Assignment</p> </div> </div> @code { [Parameter] public RenderFragment Tactical { get; set; } [Parameter] public RenderFragment Assignment { get; set; } }
页面(Index.razor)代码
@page "/" @using BlazorApp1.Component <PageTitle>Index</PageTitle> @{ string name = ""; string[] Assign = { "Sweep", "Rt35", "Rt48", "Rt100", "Rest E", "Cmd" }; Random rnd = new Random(); int a = 0; string b = ""; @for(int x=0;x<3;x++) // 三行 { <div class="comp"> @for (int i = 0; i < 10; i++) // 每行10个卡片 { a = rnd.Next(0,5); b = Assign[a]; <p>@b</p> <UnitComponent> <Tactical>Sag-1</Tactical> <Assignment>@b</Assignment> </UnitComponent> } <br /> </div> } } <div>测试结束</div>
问题原因与解决方法
原因
Blazor循环渲染时,RenderFragment属于延迟执行的闭包逻辑,它捕获的是循环变量b的引用,而非循环迭代时的当前值。当所有RenderFragment最终执行时,循环已经结束,所有子组件都会使用b的最后一个值。而页面直接输出的@b是在循环执行时立即求值,因此能显示正确结果。
解决方法
方法1:创建循环变量的局部副本
在内层循环中创建局部变量存储当前b的值,让闭包捕获这个副本:
@for (int i = 0; i < 10; i++) // 每行10个卡片 { a = rnd.Next(0,5); b = Assign[a]; // 新增局部变量保存当前值 var currentAssignment = b; <p>@b</p> <UnitComponent> <Tactical>Sag-1</Tactical> <Assignment>@currentAssignment</Assignment> </UnitComponent> }
方法2:修改参数类型为普通字符串(推荐)
当前用RenderFragment传递普通字符串属于过度设计,直接改用字符串类型参数更简洁,也能彻底避免闭包问题:
修改子组件参数定义:
@code { [Parameter] public string Tactical { get; set; } [Parameter] public string Assignment { get; set; } }
页面中直接传递字符串值:
<UnitComponent Tactical="Sag-1" Assignment="@b" />
内容的提问来源于stack exchange,提问作者SDanks
相关产品推荐
相关产品推荐

