프론트엔드/React

[React] 리액트 onClick 이벤트 작성법과 이벤트 방식 비교

여행자0 2025. 1. 26. 01:37
import React from 'react'

function App() {

    //ES6 문법, function clickMe() {} 와 동일
    const clickMe = () => {
        alert("클릭 성공")
    }

    function clickMe2() {
        alert("클릭 성공2")
    }

    return (
    <div>
        <button onClick={ clickMe }>클릭</button>
        <button onClick={ clickMe2 }>클릭2</button>
        <button onClick={ () => {alert("클릭성공3")} }>클릭3</button>
    </div>
    )


}

export default App

 

첫번째 두번째 버튼에는 onClick = { 함수명 } 으로 클릭 이벤트를 주었다.

상단에 함수 선언 시,

const clickMe = () => {} 와 같이 ES6문법 arrow function (화살표 함수)으로도 쓸 수 있고,

function clickMe2() {} 와 같이 기존 함수 작성 방식으로 쓸 수 있다.

 

여기서 주의할 점은 onClick={ } 에서 { }안에  함수명() 로 작성하지 않는다. ()는 "바로 실행" 하라는 의미이다. 

onClick={ 함수명() } 으로 작성 시, 화면이 렌더링 되는 시점에 해당 함수가 실행이 되어 불필요한 동작이 발생할 수 있다.

즉, onClick={ clickMe() } 가 아니라 onClick = { clickMe } 로 작성해야 한다.

 

 

세번째 버튼의 onClick={ () => {alert("클릭성공3")} } 의 경우,

따로 함수를 작성하지 않았고, {}안에 alert("클릭성공3")이라는 내용을 바로 작성했다.

클릭 이벤트가 발생하면, alert를 띄우라는 의미이다.

클릭 시 발생하는 이벤트가 간단한 내용일 경우, 이렇게 작성하는 게 보기 좋다.

 

 

 

위처럼 함수 작성법의 레퍼런스들을 보다가 문득 궁금한 점이 생겼다.

어떨 때 onClick = { () => event() }를 써야하는지,

어떨 때 onClick = { event } 로 써야하는지, 

case 별로 이유를 명확히 하고자 찾아보았다... 

 

 

 

onClick={ () => handleEvent() } 와 onClick={ handleEvent } 의 차이는 무엇일까?

두 방식 모두 onClick 이벤트 핸들러를 설정하는 방법이지만, 작동 방식이 다르다. 

 

 

1. onClick={ () => handleEvent() } 

<button onClick={() => handleEvent()}>Click Me</button>

작동 방식

1. 화살표 함수 () => handleEvent() 를 사용하여 새로운 함수를 생성하고, 이 함수를 onClick에 전달

2. 즉, 버튼을 클릭할 때마다 새로운 함수가 실행되고, 그 함수가 handleEvent() 를 호출

3. 만약 handleEvent 가 매개변수를 필요로 한다면, 이 방법을 사용해야 한다. 

 

<button onClick={() => handleEvent(10)}>Click Me</button>

위와 같이 인자를 전달하는 경우에는 반드시 화살표 함수를 사용해야 한다.

 

단점

1. 렌더링 될 때마다 새로운 함수가 생성되므로, 불필요한 렌더링 비용 발생

2. 자식 컴포넌트에 onClick 을 전달할 경우, useCallback 을 사용하지 않으면 불필요한 리렌더링 유발할 수 있음

 

 

 

 

2. onClick={ handleEvent }

<button onClick={ handleEvent }>Click Me</button>​

작동 방식

1. handleEvent 함수 자체를 onClick 에 전달함

2. 리액트는 handleEvent 함수를 클릭 이벤트가 발생했을 때 실행함

3. 즉, 새로운 함수가 매 렌더링마다 생성되지 않는다.

 

 

주의할 점

만약 onClick= { handleEvent() } 처럼 함수를 직접 실행하는 코드를 사용하면,

렌더링 시점에서 함수가 실행되므로 의도하지 않은 동작이 발생할 수 있다.

반드시 onClick= { handleEvent } 라고 작성해야 한다. (이것을 함수 참조라 한다.)

 

 

 

정리

방식 사용해야 하는 경우 주의할 점
onClick={ () => handleEvent() } 함수에 인자를 전달해야 할 때 렌더링마다 새로운 함수 실행됨
onClick={ handleEvent }  함수 실행만 필요할 때 함수 실행 코드 (handleEvent())를 직접 넣지 않도록 주의