关于Blazor中Overwritten Parameters参数覆盖问题的理解咨询
问题1解答
第二个Expander组件不会重渲染、参数不生效的核心原因是Blazor的参数变更检测逻辑:
- Blazor在父组件触发重渲染时,会逐个对比子组件传入的参数和上一次的传入值是否相等,只有检测到参数变化才会触发子组件的重渲染,同时用新的入参覆盖子组件的参数属性。
- 第二个
Expander的两个入参:Expanded传的是固定常量true,ChildContent没有赋值默认是null,两次渲染的入参完全一致,Blazor判定参数无变化,因此不会触发子组件重渲染,你在子组件内部通过Toggle修改的Expanded值也就不会被父组件的入参覆盖。 - 而第一个
Expander传入了ChildContent(RenderFragment是引用类型),父组件每次重渲染都会生成新的ChildContent实例,Blazor检测到ChildContent参数变化,就会触发子组件重渲染,同时把传入的常量true覆盖掉你在子组件内部修改的Expanded值。
问题2解答
这个示例核心要说明不要直接在子组件内部修改标记了[Parameter]的属性,这就是文档说的「参数覆盖」问题:
- 子组件的
[Parameter]属性本质是父组件传给子组件的输入,子组件内部修改是临时的,只要父组件重渲染时检测到任意一个入参变化,就会用父组件传入的参数值覆盖子组件内部修改的结果,导致子组件的内部状态意外重置。 - 你之前的认知是对的:父组件重渲染时如果参数有变化,确实会同步到子组件,但你没考虑到Blazor的参数变更检测跳过了入参完全无变化的子组件,才会出现两个
Expander表现不一致的情况。 - 正确的实现方式是子组件如果需要修改输入参数,应该通过
EventCallback通知父组件修改参数的数据源,用双向绑定的方式维护状态,不要直接修改[Parameter]属性本身。
内容的提问来源于stack exchange,提问作者DaPanda
相关产品推荐
相关产品推荐

