はじめに
おはようございます、Tunです。
今回は、前回の最後に記述した通りState
について記載していきます。
State(useState)
hookはReact16.8で追加された新機能です。state
などのReactの機能をクラスを書かずに使用できるようになりました。React.Component
からextends
したクラスを使用せず、また、this
の起債も必要なくなり、コード自体もスッキリをスマートに書くことができます。
なぜReactにhookを新機能として追加したのかの背景はこちら(動機)へ
まずは例を見てみましょう。
import React, { useState } from 'react';
function Example(){
const [count, setCount] = useState(0);
return(
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
このコードは、ボタンをクリックすると、カウンターの値が増加する仕組みになっています。この中のuseState
がフック(hook) にあたります。関数コンポーネントのスコープ内でローカルなstate
を使うために呼び出しており、このstate
は以降の再レンダーの間も保持されます。
[count, setCount] = useState(0);
の部分のcount
は、現在のstate
変数の状態の値を、setCount
はstateの状態を更新するための関数を持っており、useState
がこれらをペアにして返しています。また、useState
はstateの初期値を唯一引数にとります。この引数として渡されたstateの初期値は最初のレンダー時のみに使用されます。
フック(hook)とは何ぞや
フックとは、関数コンポーネントstateやライフサイクルといったReactの機能を接続する(hook into) ための関数のこと。
フックはReactをクラスなしに使うための機能です。ですので、クラス内で使用することはできません。
以前まではクラスコンポーネント(React.Component
)を使ってReact開発していましたが、2018年よりコードの削減・可読性の向上などの理由から、関数コンポーネントに移行していきました。その流れで、クラスコンポーネントしか使えない機能があり、いちいち関数からクラスへ書き換えを行うのは面倒だったためフックという機能が生まれました。
上記の例をもっと詳しく見てみましょう
-
useStateを呼ぶと何が起こるのか?
上記の例では変数をcount
と名付けましたが、なんでも好きな名前を設定することができます。この変数に関数コールの間で値を保持しておきます。通常であれば、関数が終了すると変数は消えてしまいますが、state変数はReactによって保持されます。 -
useStateは何を返すのか?
現在のstate
と、それを更新するために関数のペアを返します。これが[count, setCount] = useState();
という書き方にした理由です。
count
という名前のstate変数を宣言しており、それを初期値0
でセットしています。再レンダー間でReactはその変数の現在値を記憶しており、最新の値を関数に提供しています。現在のcount
の値を更新したい場合は、setCount
を呼ぶことで可能になります。
stateの読み出し
また、関数内では直接count
を使うことができます。
※クラスだとthis
が必要になる。
<p>You clicked {count} times</p>
stateの更新
関数内では、すでにsetCount
とcount
を変数として受けとっているので、ここもthis
は必要はありません。
<button onClick={() => setCount(count + 1)}>
Click me
</button>
これまでを振り返ると
-
useState
フックをReactからインポートし、関数コンポーネント内でローカルstate
を使えるようにする。 - Exampleコンポーネント内で
useState
を呼び出すことで新しいstate
変数を宣言します。変数と関数のペアが返されるので、任意の名前を付けます。useState
唯一の引数として0
を渡すことで、変数をゼロへと初期化します。setCount
はcount を更新する関数になります。 - ユーザがクリックした時に、新しい値で
setCount
を呼びます。ReactはExampleコンポーネントを再レンダーして新たなcountの値を渡します。
次回は副作用についてです!