【React】並び替えられるTodoアプリを作ってみた

この記事は GMOアドマーケティング Advent Calendar 2023 12日目の記事です。

はじめに

はじめまして。GMOアドパートナーズの樋笠です。

最近Reactを使い始めたので、練習のために簡単なTodoアプリを作りました。

せっかくなら、ドラッグ&ドロップでタスクを並び替えられるようにしようと思いました。

dnd kit というライブラリを使うと簡単に実装できたので、ご紹介します。

Todoアプリの概要

今回は、 Mantine というUIライブラリを使用して作成しました。

MantineはボタンなどのUIコンポーネントだけでなく、便利なhooksを提供しています。

TodoListコンポーネント

まずは、アプリの大枠部分↑です。

useListState というhookを使って、タスクの追加・編集・削除などを行えるようにしています。

今回はイベントハンドラなどの細かい実装は省略しています。

TodoItemコンポーネント

それぞれのタスクを1つのコンポーネントとして実装しました。ドラッグできるようにしたい部分ですね。

ドラッグ時に掴む持ち手部分もアイコンを利用して実装します。

並び替えの実装

では実際にドラッグして並び替えられるようにしていきます!

TodoListの修正

先ほどのTodoItemコンポーネントを DndContextSortableContext の中に入れます。

ドラッグやドロップを行うには、DndContext でコンポーネントをネストすることが必要です。

また、DndContext に渡すPropsで、衝突判定やドラッグの方向など細かい設定を行えます。

今回は、推奨されている closestCenter という衝突判定と restrictToVerticalAxis で縦方向にドラッグを固定しています。

SortableContext は今回のように並び替えを行いたい場合に使えるコンポーネントです。

もちろん、自分でドラッグ/ドロップしたいコンポーネントをカスタマイズすることもできます。

 

また、handleDragEnd には、ドラッグを終えた時の挙動を記述します。

今回は、タスクがきちんと並び替わるようにすれば良いですね。

DragEndEventから得られる、ドラッグされたコンポーネント active とドロップされた場所のコンポーネント over を利用します。

TodoItemの修正

次に、TodoItemに修正を加えていきます。

useSortable というhookを利用して、ドラッグ&ドロップに必要なオブジェクトを受け取ります。

それぞれを対応するコンポーネントに渡せば、並び替えが可能になります。

transform と transition からドラッグ時のアニメーションを作成しています。

isDragging はドラッグ中かどうかを示すflagです。それに応じてドラッグの持ち手の表示を変えています。

まとめ

dnd kit を利用して、簡単に並び替えを実装してみました。

よくあるカンバン形式のタスク管理アプリがどう実装されているのかを、少し理解できたのではないかと思います!

告知

明日はY.Gさんによる「【Adobe Photoshop】AIを活用してクリスマスカードを作る」です。
引き続き、GMOアドマーケティング Advent Calendar 2023 をお楽しみください!

 

■採用ページはこちら!
https://recruit.gmo-ap.jp/

■GMOアドパートナーズ 公式noteはこちら!
https://note.gmo-ap.jp/