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

Blazor BL0005-外部参数用法-为什么会出现警告?,blazor,Blazor,BL0005:不应在组件外部设置组件参数 我在一个组件中有一个组件。当外部组件状态更改时,我希望更新内部组件的状态。外部组件是一个自动完成实现,更改的状态是输入文本,内部组件是自动完成项目列表,其突出显示的部分是精确的 所以我通过它的参数来改变内部组件的状态。我得到这个警告。为什么? 顺便说一句,代码的工作原理和我预期的完全一样。状态为“已同步”,所有自动完成项目中的“我的匹配文本”均高亮显示 我猜更改参数可能会导致组件重新渲染自身,在我的例子中,这是完全期望的行为。否则,我为什么要在运行时更改

BL0005:不应在组件外部设置组件参数

我在一个组件中有一个组件。当外部组件状态更改时,我希望更新内部组件的状态。外部组件是一个自动完成实现,更改的状态是输入文本,内部组件是自动完成项目列表,其突出显示的部分是精确的

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

顺便说一句,代码的工作原理和我预期的完全一样。状态为“已同步”,所有自动完成项目中的“我的匹配文本”均高亮显示

我猜更改参数可能会导致组件重新渲染自身,在我的例子中,这是完全期望的行为。否则,我为什么要在运行时更改组件的参数

我在网上搜索了该警告,但除了该警告之外,我没有找到任何有用的内容:

同样,看起来像我在代码中那样修改参数是一种非常糟糕的做法,但又一次,为什么呢?是有什么原因让我不得不用不那么简单和直接的方式做这件事,还是有更简单和直接的方式做这件事?

好问题

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

我们想使设置组件参数变得困难或不可能 直接的财产。在应用程序中执行此操作时永远不正确 代码

资料来源:

然而,你必须不断地寻找原因。根源在于渲染系统,主要在于渲染系统如何处理父组件和子组件之间的参数视图

以下是Steve Sanderson的一段话:

每次父组件(索引)重新渲染时,它都会重新渲染 它的子项(计数器)并将值写入内容参数。 [……]

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

资料来源:


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

关闭参数警告并将其恢复。根据建议,我选择了一种不同的方法-我在组件中创建了一个公共setter方法。我知道这可能还是有点可疑,但至少它减轻了一些混乱。我知道父元素在渲染时会重新设置参数,因此在代码中更改它们可能会让人困惑。现在,当中间有一个方法调用时,它就像调试的清洁器一样。它还表明代码中存在一些非标准的情况。