オブジェクトが要素の配列のstate管理

オブジェクトの要素の配列を管理することは、Webアプリにてよくあります。

components配下にUserList.tsxを作成しましょう。作成したら、以下のようにUser型を定義して、User型の要素を持った配列のstateを作成しましょう。

UserList.tsx◎
import { useState } from "react";

type User = {
  id: number;
  name: string;
  isLogin: boolean;
};

export const UserList = () => {
  const [userList, setUserList] = useState<User[]>([
    { id: 1, name: "太郎", isLogin: false },
    { id: 2, name: "次郎", isLogin: false },
    { id: 3, name: "三郎", isLogin: false },
  ]);
};

そして、userListの1つの要素のisLogintrueにする関数を作成しましょう。

流れとしては、newUserListという定数を...userListと展開し、配列に再格納する形で、コピーを作成し、引数で受け取ったindex番目のisLoginをtrueに変更し(newUserList[index].isLogin = true)、setUserListnewUserListを格納するという形で値を更新します。

UserList.tsx◎
...
export const UserList = () => {
  const [userList, setUserList] = useState<User[]>([
    { id: 1, name: "太郎", isLogin: false },
    { id: 2, name: "次郎", isLogin: false },
    { id: 3, name: "三郎", isLogin: false },
  ]);

  const handleLogin = (index: number) => {
    const newUserList = [...userList];
    newUserList[index].isLogin = true;
    setUserList(newUserList);
  };
};

returnとしては、bootstrapのテーブルを利用して、ユーザー一覧を表示します。

userListmapで回して要素を格納するのですが、mapの第2引数にインデックスを取得することができるので、何番目の要素のbuttonが押されたかを判別することができます。そのため、onClickの部分をhandleLogin(index)とします。

では、こちらをApp.tsにて呼び出しましょう。

上記にて、以下のようにログインボタンを押したもののみ、ログイン中と表示されるようになります。

Last updated