将 @ref 添加到循环中的 Blazor 组件

Kah*_*azi 2 c# blazor blazor-compiler

如何@ref在循环内添加到 Blazor 组件?

@for (int i = 0; i < 10; i++)
{
    <MyComponent @ref="???"/> // I want to add this component to the list
}

@code
{
    List<MyComponent> components = new List<MyComponent>();
}
Run Code Online (Sandbox Code Playgroud)

小智 8

@Kahbazi 我无法回复,所以我必须在这里问。__value 来自哪里?

我的解决方案如下:

@for (int i = 0; i < 10; i++)
{ 
    <MyComponent @ref="ComponentRef" />
}

@code {
    List<MyComponent> ComponentRefs = new List<MyComponent>();
    MyComponent ComponentRef {
        set { ComponentRefs.Add(value); }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这样做的问题是,如果 for 循环的内容发生更改,则没有过程可以从 ComponentsRefs 列表中删除项目。 (5认同)
  • 是的,这也有效。检查 obj 文件夹并找到 MyComponent.razor.gs 您将在生成的代码中看到“__value”。 (2认同)

Kah*_*azi 4

Blazor 编译器现在的工作方式是,您可以在属性C#上注入代码@ref。您可以使用它将组件添加到列表中。

@for (int i = 0; i < 10; i++)
{
    <MyComponent @ref="components.Add((MyComponent)__value);//" />
}

@code
{
    List<MyComponent> components = new List<MyComponent>();
}
Run Code Online (Sandbox Code Playgroud)

  • 这个__值从哪里来?“名称‘__value’在当前上下文中不存在” (4认同)
  • 答案似乎完全不正确。我收到编译器错误,@ref 必须是属性或变量赋值 (4认同)
  • 难道这在新版本中已被弃用吗?我什至在另一条评论中提到的 razor.g.cs 文件中找不到“__value”。但总而言之,即使我知道如何使用,我也宁愿选择不使用它。它使用生成的代码,并且更容易发生更改。所以我真的不想依赖这个解决方案 (3认同)