You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:03:14