BL0005-外部参数的用法-为什么对此进行警告?

时间:2019-11-14 08:13:19

标签: blazor

  

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

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

因此,我通过其参数更改内部组件的状态。我得到这个警告。为什么?

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

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

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

同样,用我在代码中修改参数的方式似乎是很不好的做法,但是,又为什么呢?是我有理由以一种不太简单直接的方式做到这一点,还是有更多简单直接的方式做到这一点?

1 个答案:

答案 0 :(得分:3)

好问题!

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

  

我们要使其很难或不可能设置组件参数   财产直接。在应用程序中完成时这永远是不正确的   代码。

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

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

以下是史蒂夫·桑德森(Steve Sanderson)的一句话:

  

每次重新渲染父组件(索引)时,它都会重新渲染   其子级(Counter),然后将一个值写入Content参数。   [...]

     

解决方案是不直接更改[Parameter]属性。   这样做会导致混乱,因为它们是从两个地方写的   彼此干扰的不同地方。

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

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