0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

リストのレンダー

コンポーネントのリストをレンダーする場合は、
for ループ や 配列の map() 関数
といった JavaScript の機能を使う。

イベントハンドラ

イベントへの対応は、コンポーネントの中でイベントハンドラ関数を宣言して対応。
下記だと、 handleClick() の関数内で対応を記述。

function MyButton() {
  function handleClick() {
    alert('You clicked me!');
  }

  return (
    <button onClick={handleClick}>
      Click me
    </button>
  );
}

※ onClick={handleClick} の末尾には括弧は付かない。
イベントハンドラ関数を呼び出すわけではなく、渡すだけ。
ボタンがクリックされたときに、React がイベントハンドラを呼び出す。

useState

コンポーネントに情報を「記憶」させて表示したい場合は、
コンポーネントに state を追加して対応する。
(ボタンがクリックされた回数を数えるケースなど)

まず、React から useState をインポート。

useState からは 2 つのものが得られる。

  1. 現在の state (count)
  2. それを更新するための関数 (setCount)

(※慣習的に [something, setSomething] と記述)

同じコンポーネントを複数の場所でレンダーした場合、それぞれ場所で独自の state を持つ。
(各ボタンがそれぞれ count という state を「記憶」し、他のボタンには影響を与えない)

フック

use で始まる関数は、フック (Hook) と呼ばれる。
useState は React が提供する組み込みのフックの一つ。

(※API リファレンスで他の組み込みフックを見ることができ、
また、既存のフックを組み合わせて独自のフックを作成することも可能)

フックには通常の関数より多くの制限がある。

フックはコンポーネントのトップレベル(または他のフック内)でのみ呼び出すことができます。

条件分岐やループの中で useState を使いたい場合は、
新しいコンポーネントを抽出してそこに配置します。

コンポーネントが同じフックを利用し、一緒に更新されるようにするには、
状態を個々のボタンから「上に」移動して、それらすべてを含む最も近いコンポーネントに入れる。
-> こうすれば、どちらのボタンをクリックしても、同一のフックが利用され、連動して更新される。

props

渡される情報は props と呼ばれる。
コンポーネントはフックの状態とイベントハンドラを保持しており、それらをどちらも props として各ボタンに渡します。

例えば、ボタンをクリックすると、onClick ハンドラが発火する場合、
各ボタンの onClick プロパティは コンポーネント内の関数となっているので、その中のコードが実行される。
setCount(count + 1) というような関数が呼び出されて、count という state 変数をインクリメントした場合、
新しい count の値が各ボタンに props として渡されるため、すべてのボタンに新しい値が表示される。

(※この手法は「state のリフトアップ(持ち上げ)」と呼ばれており、
リフトアップすることで、state をコンポーネント間で共有ができる)

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?