# useState

例えば、パンくずリストのクリックした直前のリンクの色を変えたいとします。そういった場合、画面上でそ状態を保持しておいて、別のリンクをクリックした際には、状態を更新する必要があります。

そういった状態のことを**state**といい、stateを扱うのに、`useState`という**フックス**を利用します。

（**フックス**に関しては、後ほど説明します）

使い方は、`useState()`という関数を呼び出すと、配列の形で、`[state, setState]`が返却されます。`state`は値で、`setState`はstateを更新する関数になります。呼び出し時に、`useState(1)`と引数を与えることで、`state`に初期値の`1`が格納されます。そして、setStateはstateを更新するので、`setState(5)`と呼び出すと、`state`は`5`になります。stateとsetStateの命名に関しては、基本的に`[名前, set名前]`とします。

```tsx
const [state, setState] = useState(1) // stateの初期値は1

setState(5) // stateが5になる
```

上記を踏まえて、リンクをクリックした際に、その値をstateに保持するようにします。まずは、stateを定義します。state名は選択した値なので、`selectedValue`とします。このように命名はわかりやすいものにしましょう。値は文字列型を格納するので、初期値は`""（空文字）`としましょう。

<pre class="language-tsx" data-title="BreadCrumb.tsx◎"><code class="lang-tsx">...
export const Breadcrumb = () => {
  const items = ["Home", "Library", "Date"];
<strong>  const [selectedValue, setSelectedValue] = useState("");
</strong>...
</code></pre>

次にaタグのonClickイベントを修正します。ここで、`setSelectedValue`を呼び出して、`item`にてstateを更新するようにします。これで各リンクをクリックした際に、`selectedValue`に`Home`, `Library`, `Date`が格納されるようになりました。

<pre class="language-tsx" data-title="BreadCrumb.tsx◎"><code class="lang-tsx">...
          {items.map((item) => (
            &#x3C;li key={item} className="breadcrumb-item">
<strong>                &#x3C;a href="#" onClick={() => setSelectedValue(item)}>
</strong>                  {item}
                &#x3C;/a>
            &#x3C;/li>
          ))}
...
</code></pre>

最後に、この`selectedValue`が対象のリンクの場合に、aタグを外すようにします。その場合は、3項演算子を使って以下のようにします。`item`が`selectedValue`と同じ場合は、`<>{item}</>`と、それ以外は元々の形とします。

<pre class="language-tsx" data-title="BreadCrumb.tsx◎"><code class="lang-tsx">...
          {items.map((item) => (
<strong>            &#x3C;li key={item} className="breadcrumb-item">
</strong><strong>              {item === selectedValue ? (
</strong><strong>                &#x3C;>{item}&#x3C;/>
</strong><strong>              ) : (
</strong><strong>                &#x3C;a href="#" onClick={() => setSelectedValue(item)}>
</strong><strong>                  {item}
</strong><strong>                &#x3C;/a>
</strong><strong>              )}
</strong>            &#x3C;/li>
          ))}
...
</code></pre>

こちらをブラウザで確認すると、クリックした直前のリンクのみ色が変わることが確認できるかと思います。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2FXquHVwlwyPPAMUm8We8j%2F202312071.png?alt=media&#x26;token=b378cda3-999c-49ba-b60b-e0333e60d6f2" alt=""><figcaption></figcaption></figure>
