BL0005 - 外部参数使用 - 为什么会出现警告?

Har*_*rry 13 blazor

BL0005:不应在其组件之外设置组件参数。

我在一个组件中有一个组件。当我的外部组件状态发生变化时,我想更新内部组件的状态。外部组件是一个自动完成实现,改变的状态是输入文本,内部组件是自动完成项目列表,准确地说是突出显示的部分。

所以我通过它的参数改变了内部组件的状态。我收到了这个警告。为什么?

顺便说一句,代码完全按照我的预期工作。状态已同步,我匹配的文本在所有自动完成项目中突出显示。

我的猜测是更改参数可能会导致组件重新呈现自身,在我的情况下,这是完全期望和预期的行为。否则我为什么要在运行时更改组件的参数?

我在网上搜索了警告,但除了那个警告之外我没有发现任何有用的东西:https : //github.com/aspnet/AspNetCore/issues/12293

同样,看起来像我在代码中所做的那样修改参数是一种非常糟糕的做法,但同样,为什么?有没有理由我必须以不那么简单和直接的方式来做,或者有更简单和直接的方式来做到这一点?

Pos*_*rte 11

好问题!

Blazor 团队的指导方针非常简单,不直接修改参数:

我们想让直接设置组件参数属性变得困难或不可能。这在应用程序代码中完成时永远不会正确。

来源:https : //github.com/aspnet/AspNetCore/issues/8825

但是,您必须继续寻找以找到原因。根源在于渲染系统,主要是渲染系统如何处理父子组件之间的ParameterView。

这是史蒂夫桑德森的一段话:

每次您的父组件 (Index) 重新渲染时,它都会重新渲染其子组件 (Counter) 并将值写入 Content 参数。[...]

解决方案不是直接改变您的 [Parameter] 属性。这样做会导致混淆,因为它们是从相互干扰的两个不同地方编写的。

来源:https : //github.com/aspnet/AspNetCore/issues/14283#issuecomment-534651201

所以基本上不直接修改参数的原因是为了避免渲染系统不同步的风险。这会导致非常细微的错误。您的代码目前运行良好,但不能保证向 RenderTree 添加或删除组件不会导致副作用。

  • 这是一个很好的答案,但是如果我们不应该直接修改子组件的参数,我们应该做什么呢? (3认同)
  • 在我看来,这并不能真正回答问题。我有一个类似的场景 - 我创建了一个带有下一个和上一个按钮的组件,用于设置与其一起的列表框的索引,并且出现此警告。我想正确解决这个问题,上面的答案不是很有帮助。 (2认同)