演習 - To Do リストを作成する
この演習では、これまでに学習したすべてのものを使って、基本的な To Do リスト ページを Blazor アプリに追加します。
To Do リスト ページを作成する
新しい Blazor Web アプリ プロジェクトを作成します。
Todo.razor ファイルを Components/Pages フォルダーに追加する
Visual Studio と Visual Studio Code では、ソリューション エクスプローラーの Components/Pages フォルダーを右クリックし、適切なオプションを選択して新しいファイルを追加することで、Razor ファイルを追加できます。
このコマンドで .NET CLI を使用して Razor ファイルを作成することもできます。
dotnet new razorcomponent -n Todo -o Components/Pages
前述のコマンドの
-n|--name
オプションでは、新しい Razor コンポーネントの名前を指定します。 新しいコンポーネントは、-o|--output
オプションを使用してプロジェクトのComponents/Pages
フォルダーに作成されます。重要
Razor コンポーネントのファイル名は、他の HTML 要素と簡単に区別できるように、先頭文字を大文字にする必要があります。
Todo
コンポーネントを開き、/todo
の相対 URL でファイルの先頭に@page
Razor ディレクティブを追加し、レンダリング モードをInteractiveServer
に設定して、コンポーネントで UI イベントを処理できるようにします。@page "/todo" @rendermode InteractiveServer <h3>Todo</h3> @code { }
アプリに変更を適用し、"/todo" を参照して新しいページを表示してみます。
ナビゲーション メニューに To Do ページを追加する
新しい To Do リスト ページは、他の既存のページと共にナビゲーション メニューにまだ表示されません。 ナビゲーション メニューは、アプリのレイアウトの一部である NavMenu
コンポーネントで定義されます。 NavMenu
コンポーネントを更新して、To Do リスト ページへのリンクを追加しましょう。
Components/Layout/NavMenu.razor を開きます。
NavMenu
コンポーネントでnav
要素を見つけ、天気ページの既存のナビゲーション項目の下に次のdiv
要素を追加します。<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>
NavLink
コンポーネントは、アンカー タグをレンダリングする組み込みの Blazor コンポーネントです。 現在のブラウザー アドレスがNavLink
のhref
と一致する場合は、リンクのスタイル設定に使用できるactive
CSS クラスもレンダリングされます。この変更を適用した後、ナビゲーション メニューに Todo ページが表示されるはずです。
To Do 項目のリストを構築する
プロジェクトのルート (
Program.cs
と同じレベル) に新しいTodoItem.cs
ファイルを作成し、次の C# クラスをそれに追加します。public class TodoItem { public string? Title { get; set; } public bool IsDone { get; set; } = false; }
Todo.razor で、
@code
ブロック内の To Do 項目のリストのフィールドを追加します。@code { private List<TodoItem> todos = new(); }
foreach
ループを使用して、すべての To Do の順序指定されていないリストをレンダリングします。<ul> @foreach (var todo in todos) { <li>@todo.Title</li> } </ul>
リストが空であるため、To Do リストに対してレンダリングされるものはまだ表示されません。 To Do 項目をいくつか追加する方法が必要です。
To Do アイテムを追加する
To Do 項目をリストに追加するための UI 要素をいくつか追加してみましょう。
Todo.razor で、順序付けされていないリストの下に
input
タグとbutton
を追加します。<input /> <button>Add todo</button>
newTodo
文字列フィールドを作成し、@bind
ディレクティブ属性を使用してinput
にバインドします。<input @bind="newTodo" /> <button>Add todo</button> @code { private List<TodoItem> todos = new(); string newTodo = ""; }
@onclick
ハンドラーをbutton
に追加します。これにより、newTodo
の値に基づいて新しいTodoItem
がtodos
リストに追加され、newTodo
の値が空の文字列にリセットされます。<input @bind="newTodo" /> <button @onclick="AddTodo">Add todo</button> @code { private List<TodoItem> todos = new(); string newTodo = ""; void AddTodo() { if (!string.IsNullOrWhiteSpace(newTodo)) { todos.Add(new TodoItem { Title = newTodo }); newTodo = string.Empty; } } }
To Do 項目を追加できるようになり、それらがリストに表示されることを確認します。 各 To Do 項目を追加した後、
input
値をリセットする必要もあります。
チェック ボックスを追加し、不完全な To Do 項目をカウントする
To Do 項目を完了としてマークし、既存の To Do 項目を編集し、まだ実行されていない To Do 項目の数をカウントする方法が必要です。
li
要素の内容を更新して、todo.IsDone
にバインドされているcheckbox
という種類のinput
と、todo.Title
にバインドされているテキストinput
をレンダリングします。<ul> @foreach (var todo in todos) { <li> <input type="checkbox" @bind="todo.IsDone" /> <input @bind="todo.Title" /> </li> } </ul>
<h3>
ヘッダーを更新し、完了していない (IsDone
がfalse
の) Todo アイテムの数のカウントを表示するようにします。<h3>Todo (@todos.Count(todo => !todo.IsDone))</h3>
アプリに変更を適用した後、項目を追加し、項目を編集し、To Do 項目を完了としてマークし、コンポーネントをテストしてみます。
これで Blazor の To Do リストが完了 (✅) になりました。