React + Typescript その3

前回のあらすじ

前回、登録ボタンを押すと、フォームに入力したタイトルと本文がアラートに表示されるようにしました。

前回

今回は、タイトルと本文をTodoコンポーネントの配列に追加して、さらにこの配列でTodoListコンポーネントを更新するところまでを行います。

前回は主にStateを使いましたが、今回はPropsの使い方の話になります。

というわけで、前回のソースコード を元に話を進めます。

準備

TODOリストのデータはTodoコンポーネントのStateで配列として保持することにします。

そのためにまず、1件のTODOデータを扱うオブジェクトのインタフェースTodoDataを定義します。

TodoDataインタフェース

この定義はTodoコンポーネントだけではなくTodoListコンポーネントとTodoItemコンポーネントでも利用するので、Todo.tsxに定義するのではなく別ファイルTodoData.tsxを用意してから、Todo.tsxTodoList.tsxにインポートして利用します。

TodoData.tsx

タイトルと本文だけではなく、IDと更新日時もTodoDataで扱うようにします。

Todo.tsx および TodoList.tsxTodoItem.tsx では、以下の1文を加えてインポートしてください。

TodoコンポーネントのPropsとState

次に前回同様、TodoコンポーネントにPropsとStateのインタフェースを定義して、コンストラクタで初期化します。

Todo.tsx

StateのメンバtodoDataがTODOデータの格納配列、idCountはIDの配番に使うカウンタです。

クリックリスナの引き上げ

前回、登録ボタンを押すとTodoEditコンポーネントのonClick_Submit()メソッドが呼ばれるようにしました。しかし、このメソッドではTODOデータの格納先であるTodoコンポーネントのStateにアクセスできません。
そこで、onClick_Submit()メソッドをTodoコンポーネントに引き上げます。

ざっくりと処理の流れを説明するとこんな感じです。

  1. TodoコンポーネントにonClick_Submit()メソッドを用意する。
  2. TodoコンポーネントからTodoEditコンポーネントのPropsにonClick_Submit()メソッドをわたす。
  3. TodoEditコンポーネントは、登録ボタンが押されたら、PropsのonClick_Submit()メソッドを呼ぶ。
  4. TodoコンポーネントのonClick_SubmitメソッドでTODOデータを配列に追加する。

この手順に従って実装を進めてみましょう。

onClick_Submit()メソッドを用意する

まず、TodoコンポーネントonClick_Submit()メソッドを用意します。

内容は以下のとおりです。タイトルと本文を受け取って、それを元にTodoDataオブジェクトを作成して配列todoDataに追加する。ついでにidCountを進めています。

Stateを変更する場合は、Stateのメンバ変数を直接変更するのではなくて、必ずsetState()メソッドを使うことに注意してください。

Todo.tsx

PropsにonClick_Submit()メソッドを加える

TodoEditコンポーネントのPropsにonClick_Submit()メソッドを追加します。
最後のvoidonClick_Submit()メソッドの戻り値の型です。今回は何も返さないのでvoidです。

TodoEdit.tsx

TodoEditコンポーネントのPropsにonClick_Submit()メソッドを追加すると、VisualStudioCodeでは以下のように、render()メソッドでTodoEditコンポーネントがエラーになります。
TodoEditコンポーネントはPropsにonClick_Submit()メソッドを必要としているのに、それが与えられていない」という警告です。

というわけで与えてやります。

Todo.tsx

PropsのonClick_Submit()メソッドを呼ぶ

TodoEditコンポーネントのonClick_Submit()メソッドは不要になったので削除します。
登録ボタンではPropsのonClick_Submit()メソッドを呼びます。引数のタイトルと本文はTodoEditコンポーネントのStateから渡します。

TodoEdit.tsx

TODOデータを配列に追加する

これは前述のonClick_Submit()メソッドのコードの通りです。

TODOリストの表示

配列にTODOデータを追加できるようになりました。ただこれでは内部データに追加されただけなので確認ができません。
そこで次は、TODOデータ配列をTODOリストに表示できるようにします。

ここでもやはりPropsを利用してTodoTodoListTodoItemの各コンポーネントへとデータを渡します。

TodoListコンポーネントのProps(とState)

TodoListコンポーネントのPropsにはTodoDataの配列を追加します。

TodoList.tsx

TodoItemコンポーネントのProps(とState)

TodoItemコンポーネントは1件のTODOデータを扱うだけなので、PropsにはTodoDataをひとつ追加します。

TodoItem.tsx

TODOデータの表示

あとは上から順にデータを渡して、TodoItemコンポーネントで表示するだけです。

まずTodoコンポーネントからTodoListコンポーネントへTODOデータ配列を渡します。

Todo.tsx

次に、TodoListコンポーネントからTodoItemコンポーネントへTODOデータをひとつずつ渡します。
JSX内でループすることができないので、まずitemsを組み立ててからJSXに組み込んでいる点に注目してください。

TodoList.tsx

最後にTodoItemコンポーネントでの表示部分の修正です。

TodoItem.tsx

次回に続く

今回はここまでです。
TODOリストに行を追加できるようになりました。

ここまでの ソースコード です。

次回は編集ボタンと新規ボタンの動作を実装して、この一連の記事を締め括りたいと思います。