# オブジェクトのstate管理

複数のステートを1つのグループとしてまとめられる場合は、オブジェクトとしてstate管理するのが一般的です。例えばユーザーのfirstNameとlastName、loginCountなどユーザーのプロパティなので、Userオブジェクトとして管理します。User.tsにてUserオブジェクトの型エイリアスを定義しましょう。定義したら、User型のstateを作成しましょう。`useState<User>`のように宣言することで、stateの型を定義することができます。

<pre class="language-tsx" data-title="UserDetail.ts◎"><code class="lang-tsx"><strong>import { useState } from "react";
</strong>
<strong>type User = {
</strong><strong>  firstName: string;
</strong><strong>  lastName: string;
</strong><strong>  loginCount: number;
</strong><strong>};
</strong>
export const UserDetail = () => {
<strong>  const [user, setUser] = useState&#x3C;User>({
</strong><strong>    firstName: "sample",
</strong><strong>    lastName: "太郎",
</strong><strong>    loginCount: 0,
</strong><strong>  });
</strong>...

</code></pre>

ここで、`user`の`loginCount`のみ増やす関数を作成しましょう。もともとのuser.loginCountに1を足した定数を定義して、`setUser`の引数にUser型のオブジェクトを渡しますが、`firstName`と`lastName`は元々のstateの値のままで、loginCountは先ほと定義した定数を格納します。

<pre class="language-tsx"><code class="lang-tsx"><strong>  const handleLogin = () => {
</strong><strong>    const newCount = user.loginCount + 1;
</strong><strong>    setUser({
</strong><strong>      firstName: user.firstName,
</strong><strong>      lastName: user.lastName,
</strong><strong>      loginCount: newCount,
</strong><strong>    });
</strong><strong>  };
</strong></code></pre>

上記のように記述した場合、プロパティの数だけ、記述が多くなってしますので、スプレッド構文を利用することで、以下のように特定の値のみ更新することが可能です。

<pre class="language-tsx" data-title="UserDetail.ts◎"><code class="lang-tsx">...
  const [user, setUser] = useState&#x3C;User>({
    firstName: "sample",
    lastName: "太郎",
    loginCount: 0,
  });

<strong>  const handleLogin = () => {
</strong><strong>    const newCount = user.loginCount + 1;
</strong><strong>    setUser({
</strong><strong>      ...user,
</strong><strong>      loginCount: newCount,
</strong><strong>    });
</strong><strong>  };
</strong>...
</code></pre>

この関数を呼び出すボタンと、`user`の情報を表示するようにしましょう。

<pre class="language-tsx" data-title="UserDetail.ts◎"><code class="lang-tsx"> ...
   return (
    &#x3C;div>
<strong>      &#x3C;p>{user.firstName} {user.lastName}&#x3C;p>
</strong><strong>      &#x3C;p>ログイン回数: {user.loginCount} &#x3C;/p>
</strong><strong>      &#x3C;div>
</strong><strong>        &#x3C;button className="btn btn-success" onClick={handleLogin}>
</strong><strong>          ログイン
</strong><strong>        &#x3C;/button>
</strong><strong>      &#x3C;/div>
</strong>    &#x3C;/div>
  );
  ...
</code></pre>

上記にて、以下のようにログインボタンを押すことで、表示されるカウントが増えるかと思います。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2FtC1zdXox11tcy6fwIbDm%2F202312071606.png?alt=media&#x26;token=67d994d8-ce01-4f5a-98be-efa88f9e10aa" alt=""><figcaption></figcaption></figure>
