2
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?

【React初心者向け】JSXイベントハンドラでよくある間違いと正しい書き方3選

Posted at

はじめに

こんにちは!Halです!

今回は、Reactの初心者が100%ハマるJSXイベントハンドラの罠について徹底解説します。

「なんでボタンクリックしても動かないの?」「ページ読み込んだ瞬間にアラートが出るんだけど...」そんな経験ありませんか?

実は、JavaScript が console.log("test") を実行し、その戻り値(この場合は undefined)をイベントハンドラ onClick に設定しているために発生する挙動です。

今回は、そんなReact初心者が必ず通る道を回避するための3個の書き方をまとめました。

1. 【最重要】関数は「渡す」べし、「呼び出す」べからず

❌ 間違った例

const onClickHandler = () => {
  alert('クリックされました!');
}

// これはダメ!ページ読み込み時に実行される
<button onClick={onClickHandler()}>ボタン</button>

⭕️ 正しい例

const onClickHandler = () => {
  alert('クリックされました!');
}

// これが正解!関数の参照を渡す
<button onClick={onClickHandler}>ボタン</button>

なぜ括弧が不要なのか?

イベントハンドラに渡す関数は、「渡す」べきであって「呼び出す」べきではないからです。

  • onClickHandler → 関数への参照(正解)
  • onClickHandler() → 関数の実行結果(間違い)

2. 引数を渡したい時は必ずアロー関数でラップせよ

❌ 間違った例

const deleteTask = (id) => {
  console.log(`タスク${id}を削除`);
}

// これもページ読み込み時に実行される
<button onClick={deleteTask(1)}>削除</button>

⭕️ 正しい例

const deleteTask = (id) => {
  console.log(`タスク${id}を削除`);
}

// アロー関数でラップする
<button onClick={() => deleteTask(1)}>削除</button>

引数がある場合は、アロー関数を使わなければならない。

3. パフォーマンス重視なら関数参照を直接渡すべし

パフォーマンスの違い

// 高パフォーマンス(推奨)
<button onClick={handleClick}>ボタン</button>

// 低パフォーマンス(再レンダリングのたびに新しい関数が作成される)
<button onClick={() => handleClick()}>ボタン</button>

レンダーのたびに新しい関数が作成されるので、React内の最適化がうまく動作しなくなる可能性があります。

使い分けのルール:

  • 引数なしonClick={関数名}
  • 引数ありonClick={() => 関数名(引数)}

まとめ

以上の3個の書き方を全て網羅すれば、もうJSXのイベントハンドラで悩むことはありません!

参考記事

JISOUのメンバー募集中!

プログラミングコーチングJISOUでは、新たなメンバーを募集しています。
日本一のアウトプットコミュニティでキャリアアップしませんか?
興味のある方は、ぜひホームページをのぞいてみてくださ!
▼▼▼

2
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
2
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?