사용자가 웹 브라우저에서 DOM 요소들과 상호 작용하는 것을 이벤트라고 함
예를 들어 버튼에 마우스 커서를 올렸을 때는 onmouseover 이벤트를 실행하고, 클릭했을 때는 onclick 이벤트를 실행, Form 요소는 값이 바뀔 때 onchange 이벤트를 실행
사용법은 일반 HTML에서 이벤트를 작성하는 것과 비슷함
import React, {Component} from 'react';
class EventPractice extends Component {
state = {
message: ''
}
render() {
return(
<div>
<h1>이벤트 연습</h1>
<input
type='text'
name='message'
placeholder='아무거나'
value={this.state.message}
onChange={(e) => {
this.setState({
message: e.target.value
})
}}
/>
<button
onClick={() => {
alert(this.state.message);
this.setState({
message: ''
})
}}
>
확인
</button>
<h3>{this.state.message}</h3>
</div>
);
}
}
export default EventPractice;
onChange, onClick에 전달한 함수를 따로 빼내서 컴포넌트 임의 메서드로 생성
import React, {Component} from 'react';
class EventPractice extends Component {
state = {
message: ''
}
constructor(props) {
super(props);
this.handleChange = this.handleChange.bind(this);
this.handleClick = this.handleClick.bind(this);
}
handleChange(e) {
this.setState({
message: e.target.value
})
}
handleClick(e) {
alert(this.state.message);
this.setState({
message: ''
})
}
render() {
return(
<div>
<h1>이벤트 연습</h1>
<input
type='text'
name='message'
placeholder='아무거나'
value={this.state.message}
onChange={this.handleChange}
/>
<button
onClick={this.handleClick}
>
확인
</button>
<h3>{this.state.message}</h3>
</div>
);
}
}
export default EventPractice;
바벨의 transform-class-properties 문법을 사용하여 화살표 함수 형태로 메소드를 정의하면 this 바인딩을 해주지 않아도 됨!
import React, {Component} from 'react';
class EventPractice extends Component {
state = {
message: ''
}
handleChange = (e) => {
this.setState({
message: e.target.value
})
}
handleClick = (e) => {
alert(this.state.message);
this.setState({
message: ''
})
}
render() {
return(
<div>
<h1>이벤트 연습</h1>
<input
type='text'
name='message'
placeholder='아무거나'
value={this.state.message}
onChange={this.handleChange}
/>
<button
onClick={this.handleClick}
>
확인
</button>
<h3>{this.state.message}</h3>
</div>
);
}
}
export default EventPractice;
e.target.name 값을 사용하면 해당 인풋의 name을 구분해서 state를 변경하면 됨
this.setState({
[e.target.name] : e.target.value
// 이런식으로!
})
객체 안에서 key를 []
로 감싸면 그 안에 넣은 레퍼런스가 가리키는 실제 값이 key값으로 사용됨
handleKeyPress = (e) => {
if (e.key === 'Enter') {
this.handleClick();
}
}
onKeyPress={this.handleKeyPress}
import React, {useState} from 'react';
const EventPractice = () => {
const [form, setForm] = useState({
username: '',
message: ''
});
const { username, message } = form;
const onChange = e => {
console.log(e.target.value);
const nextForm = {
...form,
[e.target.name]: e.target.value
};
setForm(nextForm);
};
const onClick = () => {
alert(username + ' ' + message);
setForm({
username: '',
message: ''
});
};
const onKeyPress = e => {
if (e.key === 'Enter') {
onClick();
}
};
return (
<div>
<h1>이벤트 연습</h1>
<input
type='text'
name='username'
placeholder='사용자명'
value={username}
onChange={onChange}
/>
<input
type='text'
name='message'
placeholder='아무거나 입력하쇼'
value={message}
onChange={onChange}
onKeyPress={onKeyPress}
/>
<button onClick={onClick}>확인</button>
</div>
)
};
export default EventPractice;