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

如何让Blazor循环在StateHasChanged后重渲染?分页失效问题

Blazor QuickGrid自定义分页渲染不更新的解决方法

核心问题分析

分页循环未重新渲染的本质是组件未正确感知到pagination对象的状态变更,或是异步方法调用方式错误导致状态更新不及时。

具体修复步骤

  1. 确保分页对象实现状态变更通知
    Blazor组件依赖状态变更通知触发重新渲染。如果你的pagination类未实现INotifyPropertyChanged接口(或继承Blazor的ObservableObject),修改内部字段后组件无法自动感知变化。示例实现:
public class PaginationModel : INotifyPropertyChanged
{
    private int _currentPageIndex;
    private int? _totalItemCount;
    public int PageSize { get; set; } = 10;

    public int CurrentPageIndex
    {
        get => _currentPageIndex;
        set
        {
            if (_currentPageIndex != value)
            {
                _currentPageIndex = value;
                OnPropertyChanged();
                OnPropertyChanged(nameof(LastPageIndex));
            }
        }
    }

    public int? TotalItemCount
    {
        get => _totalItemCount;
        set
        {
            if (_totalItemCount != value)
            {
                _totalItemCount = value;
                OnPropertyChanged();
                OnPropertyChanged(nameof(LastPageIndex));
            }
        }
    }

    public int LastPageIndex => TotalItemCount.HasValue ? (int)Math.Ceiling(TotalItemCount.Value / (double)PageSize) - 1 : 0;

    public async Task SetCurrentPageIndexAsync(int index)
    {
        // 可添加数据加载等分页逻辑
        CurrentPageIndex = index;
        await Task.CompletedTask;
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
  1. 修正异步方法的调用方式
    SetCurrentPageIndexAsync是异步方法,点击事件必须用async/await等待方法执行完成,否则状态未更新就可能触发渲染:
<button class="btn btn-primary btn-sm ms-1" @onclick="async () => await pagination.SetCurrentPageIndexAsync(0)">Search</button>

若需手动调用StateHasChanged(),需放在await之后:

<button class="btn btn-primary btn-sm ms-1" @onclick="async () => { await pagination.SetCurrentPageIndexAsync(0); StateHasChanged(); }">Search</button>
  1. 验证LastPageIndex的动态计算
    确保LastPageIndex基于TotalItemCount和PageSize实时计算,而非缓存的固定值。如果LastPageIndex未在TotalItemCount或PageSize变更时重新计算,循环终止条件不会更新,页码也无法重新渲染。

  2. 检查组件渲染模式
    确认组件未使用静态渲染模式(如@rendermode="Static"),静态渲染组件无法响应客户端状态变更,需使用交互式渲染模式(如InteractiveServer或InteractiveWebAssembly)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:43:16