【问题标题】:How to pass one component reference to the other in Blazor?如何在 Blazor 中将一个组件引用传递给另一个组件?
【发布时间】:2021-10-11 03:28:42
【问题描述】:

我的主页有两个组件——状态和命令。问题是状态组件应该获得对组件之一的引用。根据我的阅读,我可以使用级联参数来实现我的目标。

主页:

<CascadingValue Value="commands">
    <States @ref="states"></States>
</CascadingValue>

<Commands @ref="commands"></Commands>

@code
{
    private Commands commands;
    private States states;
    ...

状态组件:

@code {
    [CascadingParameter]
    public Commands Commands { get; set; }
}

理论上它应该可以工作,在视觉上它们被正确渲染,但在引擎盖下它不起作用 - 状态组件接收“null”的命令,所以基本上它不会“看到”其他组件。

这里是“有趣”的部分——正如我写的状态组件接收 null,但如果我在主页中引用命令组件,就像 Blazor 意识到它已经设置并且是时候将新值传递给状态事实上,国家收到非空值。一些滞后效应还是什么?

当然我想让它自动发生。怎么做?

视觉顺序没有任何区别,当我先放在主页命令时,然后状态我得到完全相同的结果。

解决方法

我知道的最简单的解决方法是(我使用示例中的名称)将支持字段添加到“命令”并将“命令”更改为属性。每当调用 setter 时,只需在最后调用 StateHasChanged 即可。

【问题讨论】:

  • 你想达到什么目的?您想访问States 中的Commands 数据吗?
  • @AndrasCsanyi,是的,完全正确。对于各种操作,States 需要通知 Commands,所以基本上 Commands 对 States 一无所知,但 States 知道并且需要访问 Commands。
  • 我也会看看this 和事件处理程序解决方案。
  • @AndrasCsanyi 我很困惑——我展示了级联参数有滞后效应,你发布了一个级联参数的链接。这对解决问题有何帮助?
  • 如果这没有帮助,那么我关于事件的答案的第二部分可能会有所帮助。

标签: c# blazor blazor-webassembly


【解决方案1】:

您的问题是您可能还没有很好地掌握组件渲染过程以及正在发生的事情。 States 很可能在 Commands 之前渲染 - 顺序取决于他们所做的事情以及他们将第一个渲染事件堆叠到渲染器队列的时间。

如果States 首先渲染,则传递给它的级联参数为空。 commands 直到 Commands 首次渲染后才设置。之后的任何渲染周期都会将级联参数的有效值传递给States

这不是一个好的设计。你应该只级联这样的组件:

<Commands @ref="commands">
  <CascadingValue Value="commands">
    <States @ref="states"></States>
  </CascadingValue>
</Commands>

CommandsStates 被渲染之前肯定存在。 States 总是会得到一个有效的对象。

【讨论】:

  • CascadingParameter 不仅仅是一个参数,它应该会自动刷新。其次,在您的代码中,布局决定了逻辑(数据流)。因此,在这种情况下,您提出的这种捆绑组件当然是一种很好的方法,但问题是在一般情况下如何解决这个问题。
  • 如果你必须做上面展示的事情,即两个未连接的组件进行单/双向通信,你需要实现一个状态服务。一个组件在服务中引发和事件,而另一个组件通过事件获取通知。搜索 Blazor 通知服务。
猜你喜欢
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多