Exercício – vinculação de dados e eventos
Neste exercício, você criará um componente básico de lista do Todo dentro do seu aplicativo Blazor.
Criar a página de Lista de Tarefas (Todo)
Criar a página Todo:
No Visual Studio, clique com o botão direito do
Components/Pagesmouse na pasta no Gerenciador de Soluções e selecione Adicionar>Componente Razor. Dê um nome ao componenteTodo.razor.No Visual Studio Code, clique com o botão direito na pasta no
Pagese selecione Adicionar Novo Arquivo>. Dê um nome ao componenteTodo.razor. O arquivo deve ser criado dentro da pastaPagesImportante
Os nomes de arquivo do componente Razor exigem a primeira letra em maiúscula. Expanda a pasta
Pagese confirme se o nome do arquivo do componente da ListaTodocomeça com uma letraTmaiúscula. O nome de arquivo seráTodo.razor.Abra o componente
Todoe adicione uma diretiva@pagedo Razor ao início do arquivo com a URL relativa/todo.@page "/todo" <h3>Todo</h3> @code { }Salve o arquivo
Components/Pages/Todo.razor
Adicione o componente Todo à barra de navegação
O layout do aplicativo usa o componente NavMenu. Layouts são componentes que permitem evitar a duplicação de conteúdo em um aplicativo. O componente NavLink renderiza uma marca de âncora HTML que pode ser estilizada para fornecer uma indicação na interface do usuário do aplicativo quando a URL do aplicativo corresponde ao link.
Expanda a pasta Componentes/Layout no Gerenciador de Soluções e abra o arquivo NavMenu.razor . Na seção <nav>...</nav> do componente NavMenu, adicione o novo <div>...</div> a seguir e o componente NavLink ao componente Todo.
Em Components/Layout/NavMenu.razor:
<!-- .. -->
<div class="nav-scrollable" onclick="document.querySelector('.navbar-toggler').click()">
<nav class="flex-column">
<!-- ... -->
<div class="nav-item px-3">
<NavLink class="nav-link" href="todo">
<span class="bi bi-list-nested-nav-menu" aria-hidden="true"></span> Todo
</NavLink>
</div>
</nav>
</div>
Salve o arquivo Components/Layout//NavMenu.razor. O navegador será atualizado automaticamente e agora terá a entrada Todo na barra de navegação:
Criar um item Todo
No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e selecione Adicionar>Nova Pasta. Nomeie a nova pasta Data.
No Gerenciador de Soluções, clique com o botão direito do mouse na pasta Dados e selecione Adicionar>Classe. Nomeie a nova classe TodoItem.cs e selecione Adicionar. Essa nova classe conterá uma classe C# que representa um item da Lista Todo.
Substitua o código da Linha 7 para baixo pelo código C# a seguir para a classe TodoItem. Declare o Title como uma cadeia de caracteres que permite valor nulo usando ?. Salve o arquivo.
namespace BlazorHybridApp.Data;
public class TodoItem
{
public string? Title { get; set; }
public bool IsDone { get; set; } = false;
}
Associar uma lista de TodoItems
Agora você está pronto para associar uma coleção de objetos TodoItem ao HTML no Blazor. Faremos isso aplicando as alterações a seguir no arquivo Components/Pages/Todo.razor:
- Adicione a declaração de uso para
TodoItemcom@using BlazorHybridApp.Data. - Adicione um campo para os itens de tarefas pendentes ao bloco
@code. O componenteTodousa esse campo para manter o estado da lista de tarefas pendentes. - Adicione marcação da lista não ordenada e um loop
foreachpara renderizar cada item de tarefa pendente como um item de lista (<li>).
@page "/todo"
@using BlazorHybridApp.Data
<h3>Todo</h3>
<ul class="list-unstyled">
@foreach (var todo in todos)
{
<li>@todo.Title</li>
}
</ul>
@code {
private List<TodoItem> todos = new();
}
Adicionar elementos de formulário para criar listas de tarefas pendentes
O aplicativo requer elementos de interface do usuário para adicionar itens de tarefas à lista. Adicione uma entrada de texto (
<input>) e um botão (<button>) abaixo da lista não ordenada (<ul>...</ul>):@page "/todo" @using BlazorHybridApp.Data <h3>Todo</h3> <ul class="list-unstyled"> @foreach (var todo in todos) { <li>@todo.Title</li> } </ul> <input placeholder="Something todo" /> <button>Add todo</button> @code { private List<TodoItem> todos = new(); }Nada acontece quando o botão
Add todoé selecionado, porque nenhum manipulador de eventos está anexado ao botão.Adicione um método
AddTodoao componenteTodoe registre o método para o botão usando o atributo@onclick. O método C#AddTodoé chamado quando o botão é selecionado:<input placeholder="Something todo" /> <button @onclick="AddTodo">Add todo</button> @code { private List<TodoItem> todos = new(); private void AddTodo() { // Todo: Add the todo } }Para obter o título do novo item de tarefa pendente, adicione um campo de cadeia de caracteres
newTodono início do bloco@code:@code { private List<TodoItem> todos = new(); private string? newTodo; // Omitted for brevity... }Modifique o elemento
<input>para associarnewTodoao atributo@bind:<input placeholder="Something todo" @bind="newTodo" />Atualize o método
AddTodopara adicionar oTodoItemcom o título especificado à lista. Limpe o valor da entrada de texto configurandonewTodopara uma cadeia de caracteres vazia:@page "/todo" @using BlazorHybridApp.Data <h3>Todo</h3> <ul class="list-unstyled"> @foreach (var todo in todos) { <li>@todo.Title</li> } </ul> <input placeholder="Something todo" @bind="newTodo" /> <button @onclick="AddTodo">Add todo</button> @code { private List<TodoItem> todos = new(); private string? newTodo; private void AddTodo() { if (!string.IsNullOrWhiteSpace(newTodo)) { todos.Add(new TodoItem { Title = newTodo }); newTodo = string.Empty; } } }Salve o arquivo
Components/Pages/Todo.razor. Compile e inicie novamente o aplicativo.Você pode definir o texto do título de cada item da Lista Todo como editável, e uma caixa de seleção pode ajudar o usuário a acompanhar os itens que vão sendo concluídos. Adicione uma entrada de caixa de seleção para cada item de tarefa pendente e associe o valor dele à propriedade
IsDone. Altere o@todo.Titlepara um elemento<input>vinculado atodo.Titlecom@bind:<ul class="list-unstyled"> @foreach (var todo in todos) { <li> <input type="checkbox" @bind="todo.IsDone" /> <input @bind="todo.Title" /> </li> } </ul>Atualize o cabeçalho
<h3>para mostrar uma contagem do número de itens de tarefas pendentes que não foram concluídos (IsDoneéfalse).<h3>Todo (@todos.Count(todo => !todo.IsDone))</h3>Salve o arquivo
Components/Pages/Todo.razore execute o aplicativo novamente.Adicione, edite e marque os itens como concluídos para testar o componente.