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

调用StateHasChanged后页面未正确刷新,如何解决?

解决方案

问题根源

OnInitialized仅在组件首次创建时执行一次,后续父组件传递的参数(如Disabled、BackgroundColor)变化时,不会再次触发该方法。当前Text组件将背景色样式类的初始化逻辑放在OnInitialized中,导致参数更新后样式无法同步。

最优修复方案

1. 将样式逻辑移至OnParametersSet方法

OnParametersSet会在组件初始化后,每次参数变化时触发,适合处理依赖参数的UI状态更新。修改Text组件的代码:

protected override void OnInitialized()
{
    // 保留仅需初始化一次的逻辑
    HtmlId = string.IsNullOrEmpty(HtmlId) ? Label.Replace(" ", "-") + "-input": HtmlId;

    if (string.IsNullOrEmpty(PlaceHolder))
    {
        PlaceHolder = $"Introduce {Label}";
    }

    if (string.IsNullOrWhiteSpace(Value))
    {
        Value = string.Empty;
    }

    if (!Disabled && !MaintainValue && string.IsNullOrWhiteSpace(Value))
    {
        Value = string.Empty;
    }
}

protected override void OnParametersSet()
{
    // 每次参数变化时重新计算样式类
    _containerClass = $"box flex align-left {GetBackgroundClass(BackgroundColor)}";
    _inputClass = $"{GetBackgroundClass(BackgroundColor)}";

    if (SizeSmall)
    {
        _inputClass += " small-select-input margin-tb-stage";
    }
}

2. 确保父组件状态更新的正确性

当前父组件中editablePrompts已通过new List重新赋值,Blazor会识别集合引用变化,触发子组件的参数更新,这部分逻辑无需修改。

为什么不推荐修改OnChange传背景色?

这种方案会将UI样式逻辑与业务值变化逻辑耦合,违反组件单一职责原则,后续维护时容易引发逻辑混乱,且不符合Blazor组件生命周期的设计理念。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 13:25:55