【问题标题】:BL0005 - external parameter usage - why is a warning for that?BL0005 - 外部参数使用 - 为什么会出现警告?
【发布时间】:2019-11-14 08:13:19
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 关闭参数警告并恢复。推荐人stackoverflow.com/a/62703421/11792002
  • 我选择了一种不同的方法——我在组件中创建了一个公共的 setter 方法。我知道这仍然可能是一件有点阴暗的事情,但至少它减轻了一些混乱。我了解父元素(重新)在渲染时设置参数,因此在代码中更改它们可能会令人困惑。现在,当中间有一个方法调用时,调试起来就更干净了。它还表明在代码中发生了一些非标准的事情。

标签: blazor


【解决方案1】:

好问题!

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

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

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

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

这是史蒂夫·桑德森(Steve Sanderson)对此的引用:

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

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

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

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

【讨论】:

  • 这个答案很好,但是如果我们不应该直接修改子组件的参数,我们应该怎么做呢?
【解决方案2】:

也许我在这里遗漏了一些东西,但人们不应该建议在组件上使用@bind-Value="yourVariable",然后在他们的代码中修改yourVariable 的值吗?

【讨论】:

  • 也许提起来太明显了 ;) 当然你是对的。除了一些丑陋的黑客之外,这就是大部分时间的做法。这是因为我想在某些事情上做一个例外,这并不完全奏效,添加了一个解决方法,它破坏了某些东西,添加了另一个解决方法,这就是它的方式......经验法则是,当 VS 发出警告时,这可能有一个很好的理由。因此,在任何地方禁用警告之前彻底理解它是至关重要的。
猜你喜欢
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 2014-09-25
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
相关资源
最近更新 更多