2022.01.24.Mon
onClick={() => selectMenuHandler(index)}
는 웹에서 실행이 잘 되는 반면, onClick={selectMenuHandler(index)}
는 왜 실행이 되지 않고 에러페이지가 뜨는지 궁금했다.
( onClick={ } 안에 arrow function을 쓰는것과 그냥 함수이름을 쓰는 것의 차이점이 정확히 무엇인가요? )
Error: Too many re-renders. React limits the number of renders to prevent an infinite loop.
(아고라 스테이츠 이용하여 해결)
결론부터 :
const btn = document.querySelector('button')
function hello(){
console.log('hi')
}
// 예시1
btn.addEventListener('click', hello)
// 예시2
btn.addEventListener('click',()=>{
hello()
})
// 예시3
btn.addEventListener('click',hello())
클릭 했을때 뒤에꺼 해줘~ 라는 뜻이다. 예시1, 2는 잘 작동하지만 예시3은 함수를 바로 호출 하기 때문에 안된다.
function hello(){
console.log('hi')
}
// 예시 1
<button onClick={hello}>버뜬!</button>
// 예시2
<button onClick={()=>hello()}>버뜬!</button>
// 예시3
<button onClick={hello()}>버뜬!</button>
React에서는 이벤트 처리할 때마다 함수를 호출하는 형태가 아닌 함수 자체를 전달한다. 그래서 예시 1은 잘 된다.
근데 예시 3은 : 버튼을 누를때마다 함수가 호출되니 상태(state)가 변경된다. React에서는 상태가 변경되면 상태와 관련된 데이터들이 다시 렌더링이 되는 특징이 있다. 그래서 예시3번 처럼 작성하면 (상태변경 함수 있는 경우) 무한으로 호출이 되는 것이다. (다만 예시는 변경함수 아니다. 오해x)
예시 2 같은 형태는 이벤트 헨들러나 콜백에 매개변수를 전달 할 때 많이 사용한다. 이벤트 핸들러에 화살표 함수를 사용하하여 감싼 다음에 매개변수를 넘겨 줄 수 있다. 콜백함수를 작성하는 경우. 함수를 호출하는 형태가 아닌, 함수자체를 넣은 것과 같기 때문에 가능하다.