특정 사건
사건, 특정 사건을 의미
<button onclick="activate()">
Activate
</button>
// 버튼을 누르면 activate 함수 호출
// 클릭 이벤트 처리하는 함수 onclick을 통해서 전달
<button onClick={activate}>
Activate
</button>
// 카멜 표기법
// DOM에서 Event 처리를 문자열로 전달, React는 함수 그대로 전달
= Event Listener
이벤트가 발생하는 것을 계속 듣고있다는 의미
어떤 사건이 발생하면 사건을 처리하는 역할
// Toggle Class Component
class Toggle extends React.Component {
constructor(props) {
super(props);
this.state = { isToggleOn: true };
// callback에서 'this'를 사용하기 위해서는 바인딩을 필수적으로 해줘야 함
// 바인드하는 이유 : 자바스크립트에서 기본적으로 class 함수들이 바인딩되지 않음
this.handleClick = this.handleClick.bind(this);
}
// 일반적인 함수를 정의와 동일, 가로와 중괄호 사용해서 class함수 정의
// constructor에서 bind를 이용해 this.handleClick에 대입
handleClick() {
this.setState(prevState => ({
isToggleOn: !prevState.isToggleOn
}));
}
render() {
return (
<button onClick={this.handleClick}>
{this.state.isToggleOn ? '켜짐' : '꺼짐'}
</button>
);
}
}
// Component State에는 isToggleOn boolean 변수가 있음
// 버튼 클릭시 Event Handler인 handleClick이 호출
class MyButton extends React.Component {
handleClick = () => {
console.log('this is:', this);
}
class MyButton extends React.Component {
handleClick() {
console.log('this is:', this);
}
render() {
// 이렇게 하면 'this'가 바운드
return (
<button onClick={() => this.handleClick()};
클릭
</button>
);
}
}
// MyButton Component가 렌더링될 때마다 다른 callback 함수가 생성되는 문제가 있음
// 이 callback 함수가 하위 컴포넌트 prop으로 넘겨지면 하위컴포넌트가 추가적으로 렌더링이 발생
❕ 성능 문제를 피하기 위해서 bind나 class fields syntax 사용하는 것을 권장
❕ 참고 링크 [자바스크립트 함수의 작동 원리 일부분]
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Golobal_objects/Function/bind
function Toggle(props) {
const [isToggleOn, setIsToggleOn] = useState(true);
// 방법 1. 함수 안에 함수로 정의
function handleClick() {
setIsToggleOn((isToggleOn) => !isToggleOn);
}
// 방법 2. arrow function을 사용하여 정의
const handleClick = () => {
setIsToggleOn((isToggleOn) => !isToggleOn);
}
return (
<button onClick={handleClick}>
{isToggleOn ? "켜짐" : "꺼짐"}
</button>
);
}
함수에 전달할 데이터
Event Handler에 전달할 데이터
// Event란 매개변수는 리액트의 Event 객체
// 첫번째 매개변수는 id, 두번째 매개변수로 Event 전달
// 명식적으로 Event를 두번째 매개변수로 넣어줌
<button onClick={(event) => this.deleteItem(id, event)}>삭제하기</button>
// Event 자동으로 id이후로 두번째 매개변수로 전달
<button onClick={this.deleteItem.bind(this, id)}>삭제하기</button>
function MyButton(props) {
const handleDelete = (id, event) => {
console.log(id, event.target);
};
return (
<button onClick={(event) => handleDelete(1, event)}>
삭제하기
</button>
);
}
// 매개변수 순서는 마음대로