🌟

reactのコンポーネントの関数になぜアロー関数を使うのか?

2024/12/08に公開2

reactでコンポーネントを呼び出す際に、プロパティにstate変数などのハンドル関数を実装する時がある。

export default function Example() {
const [value, setValue] = useState(null);

const handle(value) => {
    console.log('value: ', value);
    setValue(value);
}
return (
    <Example value="value" onClick={handle('hoge')}>
);

}

上記だとExampleコンポーネントのレンダーの一部としてhandle()が即時実行されてしまいます。
これにより、setValueが実行された後に再度レンダーされ、無限ループになってしまいます。

上記のような無限ループを防ぐためには、以下のように即時実行関数を呼ぶのではなく、propsとして関数を渡す方式を取ります。(このためにアロー関数を使います)

export default function Example() {
const [value, setValue] = useState(null);

const handle(value) => {
    console.log('value: ', value);
    setValue(value);
}
return (
    <Example value="value" onClick={()=>handle('hoge')}>
);

}

Discussion

ぶんちんぶんちん

ん?
Onclickに関数として渡すか関数の評価値を渡すかの違いで関数を渡したいからじゃないですか?
handle関数の定義もなんかfunctionとごちゃってませんかね

TommyTommy

ご指摘ありがとうございます。

Onclickに関数として渡すか関数の評価値を渡すかの違いで関数を渡したいからじゃないですか?

なるほど、’即時実行関数を呼ぶ’と書いてますが、'関数の評価値を渡す'という表現の方が正しいですね。
噛み砕くと以下のような認識で間違いないでしょうか?
{}で囲まれたコードはJSとして認識されるため、レンダー後にすぐ評価される。
{}内で()をつけてしまうと、関数実行と認識され、実行される。今回の場合、その返り値がonClickに渡す値になる。

handle関数の定義もなんかfunctionとごちゃってませんかね

こちらは完全にfunctionとアロー関数がごちゃってました。
const handle = (value) => {...}
が正しいですね。