如何在循环中呈现组件列表 (Blazor)?
How do you render a list of components in a loop (Blazor)?
我一定是遗漏了 blazor 中非常明显的东西...我想简单地渲染一个包含组件的列表,但是没有(明显的?)方法来引用迭代器(它是一个组件)进行渲染?
TodoList.razor
<input @bind="_newTodo" />
<button @onclick="@AddTodoItem">+</button>
@foreach (TodoItem todoItem in _todoItems)
{
// todoItem is a razor component, yet I can't simply render it here?
// <todoItem />
}
@code {
private IList<TodoItem> _todoItems = new List<TodoItem>();
private string _newTodo;
private void AddTodoItem()
{
if (!string.IsNullOrWhiteSpace(_newTodo))
{
_todoItems.Add(new TodoItem { Title = _newTodo });
_newTodo = string.Empty;
}
}
}
TodoItem.razor
<span>@Title</span>
@code {
public string Title { get; set; }
}
在 React 中,这很容易做到,并且可以像您刚才那样工作,但在 Blazor 中,我认为您无法按照您尝试的方式做到这一点。
一个解决方案是 class 保存组件属性并将属性传递给它
<input @bind="_newTodo" />
<button @onclick="@AddTodoItem">+</button>
@foreach (TodoItem todoItem in _todoItemsDto)
{
// Pass the Dto properties to the component
<TodoItem Title="@todoItem.Title" />
}
@code {
private IList<TodoItemDto> _todoItemsDto = new List<TodoItemDto>();
private string _newTodo;
class TodoItemDto {
public string Title { get; set; }
}
private void AddTodoItem()
{
if (!string.IsNullOrWhiteSpace(_newTodo))
{
_todoItems.Add(new TodoItemDto { Title = _newTodo });
_newTodo = string.Empty;
}
}
}
我刚刚构建了一个包含 LinkButton 组件的帮助系统,我将其呈现为:
foreach (HelpCategory category in Categories)
{
<LinkButton Category=category Parent=this></LinkButton>
<br />
}
每个 HelpCategory 都有一篇或多篇可以展开的帮助文章。
这是我的 LinkButton 的代码,它做了更多相同的事情:
@using DataJuggler.UltimateHelper.Core
@using ObjectLibrary.BusinessObjects
@if (HasCategory)
{
<button class="linkbutton"
@onclick="SelectCategory">@Category.Name</button>
@if (Selected)
{
<div class="categorydetail">
@Category.Description
</div>
<br />
<div class="margintop">
@if (ListHelper.HasOneOrMoreItems(Category.HelpArticles))
{
foreach (HelpArticle article in Category.HelpArticles)
{
<ArticleViewer HelpArticle=article Parent=this>
</ArticleViewer>
<br />
<div class="smallline"></div>
}
}
</div>
}
}
我一定是遗漏了 blazor 中非常明显的东西...我想简单地渲染一个包含组件的列表,但是没有(明显的?)方法来引用迭代器(它是一个组件)进行渲染?
TodoList.razor
<input @bind="_newTodo" />
<button @onclick="@AddTodoItem">+</button>
@foreach (TodoItem todoItem in _todoItems)
{
// todoItem is a razor component, yet I can't simply render it here?
// <todoItem />
}
@code {
private IList<TodoItem> _todoItems = new List<TodoItem>();
private string _newTodo;
private void AddTodoItem()
{
if (!string.IsNullOrWhiteSpace(_newTodo))
{
_todoItems.Add(new TodoItem { Title = _newTodo });
_newTodo = string.Empty;
}
}
}
TodoItem.razor
<span>@Title</span>
@code {
public string Title { get; set; }
}
在 React 中,这很容易做到,并且可以像您刚才那样工作,但在 Blazor 中,我认为您无法按照您尝试的方式做到这一点。
一个解决方案是 class 保存组件属性并将属性传递给它
<input @bind="_newTodo" />
<button @onclick="@AddTodoItem">+</button>
@foreach (TodoItem todoItem in _todoItemsDto)
{
// Pass the Dto properties to the component
<TodoItem Title="@todoItem.Title" />
}
@code {
private IList<TodoItemDto> _todoItemsDto = new List<TodoItemDto>();
private string _newTodo;
class TodoItemDto {
public string Title { get; set; }
}
private void AddTodoItem()
{
if (!string.IsNullOrWhiteSpace(_newTodo))
{
_todoItems.Add(new TodoItemDto { Title = _newTodo });
_newTodo = string.Empty;
}
}
}
我刚刚构建了一个包含 LinkButton 组件的帮助系统,我将其呈现为:
foreach (HelpCategory category in Categories)
{
<LinkButton Category=category Parent=this></LinkButton>
<br />
}
每个 HelpCategory 都有一篇或多篇可以展开的帮助文章。
这是我的 LinkButton 的代码,它做了更多相同的事情:
@using DataJuggler.UltimateHelper.Core
@using ObjectLibrary.BusinessObjects
@if (HasCategory)
{
<button class="linkbutton"
@onclick="SelectCategory">@Category.Name</button>
@if (Selected)
{
<div class="categorydetail">
@Category.Description
</div>
<br />
<div class="margintop">
@if (ListHelper.HasOneOrMoreItems(Category.HelpArticles))
{
foreach (HelpArticle article in Category.HelpArticles)
{
<ArticleViewer HelpArticle=article Parent=this>
</ArticleViewer>
<br />
<div class="smallline"></div>
}
}
</div>
}
}