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

Blazor Server中MudSelect点击箭头后下拉项延迟显示问题

MudSelect点击后下拉列表延迟显示/空列表的解决办法

针对Blazor Server中MudSelect点击箭头后偶尔出现下拉列表为空、延迟加载的问题,可通过以下几个方向解决:

1. 确保UI状态正确触发更新

Blazor Server的异步操作有时不会自动触发组件重渲染,导致数据加载完成后UI未及时更新。在数据加载前后手动调用StateHasChanged(),强制组件刷新:

protected override async Task OnInitializedAsync()
{
    IsLoading = true;
    StateHasChanged(); // 立即显示加载骨架
    await GetProgramsAsync();
    IsLoading = false;
    StateHasChanged(); // 确保数据加载完成后更新下拉选项
}

2. 加载期间禁用下拉组件

在数据未加载完成时,禁用MudSelect防止用户提前点击,避免出现空下拉的情况:

<MudSelect T="int" ValueChanged="OnProgramChange" Value="DemandModel.ToProgramId"
           Label="Identifiant"
           Variant="Variant.Text" ReadOnly="ReadOnly"
           For="@(() => DemandModel.ToProgramId)"
           Disabled="@IsLoading"> <!-- 加载状态下禁用 -->

3. 检查共享状态的线程安全

如果EnumState.Programs是跨组件共享的状态,确保数据更新操作在UI线程执行,或使用线程安全集合(如ConcurrentBag<T>),避免因线程竞争导致UI读取到不完整的数据。

4. 升级MudBlazor版本

部分旧版本的MudSelect存在渲染逻辑bug,建议升级到最新稳定版,排查是否是框架已知问题导致的延迟。

修改后的完整代码示例

<MudItem xs="12" sm="6">
    @if (IsLoading)
    {
        <MudSkeleton Width="100%" Height="56px" Animation="Wave" />
    }
    else
    {
        <MudSelect T="int" ValueChanged="OnProgramChange" Value="DemandModel.ToProgramId"
                   Label="Identifiant"
                   Variant="Variant.Text" ReadOnly="ReadOnly"
                   For="@(() => DemandModel.ToProgramId)"
                   Disabled="@IsLoading">
            <MudSelectItem Value="0">@(string.Empty)</MudSelectItem>
            @foreach (var program in EnumState.Programs)
            {
                <MudSelectItem Value="@program.Id">
                    @(CultureInfo.CurrentCulture?.Name == "fr-FR" ? program.NameFr : program.NameEn)
                </MudSelectItem>
            }
        </MudSelect>
    }
</MudItem>

@code {
    private bool IsLoading = false;

    protected override async Task OnInitializedAsync()
    {
        IsLoading = true;
        StateHasChanged();
        await GetProgramsAsync();
        IsLoading = false;
        StateHasChanged();
    }

    private async Task GetProgramsAsync()
    {
        // 替换为实际的数据获取逻辑(API调用、数据库查询等)
        await Task.Delay(1000);
        EnumState.Programs = new List<Program>
        {
            new Program { Id = 1, NameFr = "Programme 1", NameEn = "Program 1" },
            new Program { Id = 2, NameFr = "Programme 2", NameEn = "Program 2" }
        };
    }

    private void OnProgramChange(int value)
    {
        DemandModel.ToProgramId = value;
    }

    // 示例模型类,根据实际项目调整
    public class Program
    {
        public int Id { get; set; }
        public string NameFr { get; set; }
        public string NameEn { get; set; }
    }

    public static class DemandModel
    {
        public static int ToProgramId { get; set; }
    }

    public static class EnumState
    {
        public static List<Program> Programs { get; set; } = new List<Program>();
    }
}

内容的提问来源于stack exchange,提问作者Riley Christian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:44:58