1. 이벤트 이름은 카멜 표기법으로 작성합니다.
2. 이벤트에 실행할 자바스크립트 코드를 전달하는 것이 아닌 함수 형태의 값을 전달
3. DOM 요소에만 이벤트를 설정할 수 있음
리액트에서 지원하는 이벤트 종류는 다음과 같다. 리액트 메뉴얼(https://facebook.github.io/react/docs/event.html)을 참고하여 이벤트들에 대한 자세한 설명들을 볼 수 있다.
실습할 단계는 다음과 같다.
src 디렉터리 내부에 EventPractice.js 파일을 만들어 기능을 구현해보겠다.
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
render() {
return (
<div>
<h1>이벤트 연습</h1>
</div>
);
}
}
export default EventPractice;
App 컴포넌트에서 EventPractice를 불러와 렌더링 하면이벤트 연습 화면이 렌더링 된 화면을 볼 수 있다.
// App.js
import EventPractice from "./EventPractice";
const App = () => {
return <EventPractice />;
};
export default App;
EventPractice 컴포넌트에 input 요소를 렌더링 하는 코드와 해당 요소에 onChange 이벤트를 설정하는 코드를 작성한다.
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
render() {
return (
<div>
<h1>이벤트 연습</h1>
<input
type="text"
name="message"
onChange={
(e) => {
console.log(e);
}
}
/>
</div>
);
}
}
export default EventPractice;
이러한 코드를 작성하고 웹 브라우저에서 크롬 개발자 도구(F12)의 console을 열어 인풋에 입력할 수 있다.
state에 input 값을 담겠습니다. 생성자 메서드인 constructor에서 state 초깃값을 설정하고, 이벤트 핸들링 함수 내부에서 this.setState 메서드를 호출하여 state를 업데이트할 수 있다.
* state에 대한 내용은 3장(https://jiyesmoon.tistory.com/19)을 참고하세요
// EventPractice.js
import {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
})
}
}
/>
</div>
);
}
}
export default EventPractice;
input에 아무거나 입력하여 오류가 발생하지 않으면 잘 담긴 것이다.
input 요소 코드 아래쪽에button을 하나 만들고, 클릭 이벤트가 발생하면 현재comment 값을 메시지 박스로 띄운 후 comment 값을 공백으로 설정한다. alert를 사용하여 현재 message 값을 화면에 표시한다.
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
state = {
message: ""
}
render() {
return (
<div>
<h1>이벤트 연습</h1>
( ... )
<button onClick={
() => {
alert(this.state.message);
this.setState({
message: ""
});
}
}>확인</button>
</div>
);
}
}
export default EventPractice;
앞선 리액트 이벤트 사용 시 주의사항 1번에서 함수 형태의 객체 값을 전달한다고 배웠다. 이벤트를 처리할 때 렌더링 하는 동시에 함수를 작성할 수도 있지만, 함수를 미리 준비하여 전달하는 방법도 있다. onChange와 onClick에 전달한 함수를 따로 빼내서 컴포넌트 임의 메서드를 만들겠다.
// EventPractice.js
import {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() {
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>
</div>
);
}
}
export default EventPractice;
기본 작업은 새 메서드를 만들 때마다constructor를 수정해야 하기 때문에 불편하다. 이 작업을 간단하게 하려면 바벨의 transfor-class-properties 문법을 사용하여 화살표 함수 형태로 메서드를 정의할 수 있다.
// EventPractice.js
import {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 = () => {
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>
</div>
);
}
}
export default EventPractice;
input이 여러 개일 때는 event 객체를 이용하여 e.target.name의 값을 사용한다. onChange 이벤트 핸들러에서 e.target.name은 해당 input의 name을 가리킨다.
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
state = {
username: "",
message: ""
}
handleChange = (e) => {
this.setState({
[e.target.name]: e.target.value
});
}
handleClick = () => {
alert(this.state.username + ":" + this.state.message);
this.setState({
username: "",
message: ""
});
}
render() {
return (
<div>
<h1>이벤트 연습</h1>
<input
type="text"
name="username"
placeholder="사용자명"
value={this.state.username}
onChange={this.handleChange}
/>
<input
type="text"
name="message"
placeholder="아무거나 입력해 보세요"
value={this.state.message}
onChange={this.handleChange}
/>
<button onClick={this.handleClick}>확인</button>
</div>
);
}
}
export default EventPractice;
키를 눌렀을 때 발생하는 KeyPress 이벤트를 처리하는 방법을 알아보겠다. comment 인풋에서 엔터를 눌렀을 때 handleClick 메서드를 호출하도록 하는 코드다.
// EventPractice.js
import {Component} from 'react';
class EventPractice extends Component {
state = {
username: "",
message: ""
}
handleChange = (e) => {
this.setState({
[e.target.name]: e.target.value
});
}
handleClick = () => {
alert(this.state.username + ":" + this.state.message);
this.setState({
username: "",
message: ""
});
}
handleKeyPress = (e) => {
if(e.key === 'Enter') {
this.handleClick();
}
}
render() {
return (
<div>
<h1>이벤트 연습</h1>
<input
type="text"
name="username"
placeholder="사용자명"
value={this.state.username}
onChange={this.handleChange}
/>
<input
type="text"
name="message"
placeholder="아무거나 입력해 보세요"
value={this.state.message}
onChange={this.handleChange}
onKeyPress={this.handleKeyPress}
/>
<button onClick={this.handleClick}>확인</button>
</div>
);
}
}
export default EventPractice;
기존의 클래스형 컴포넌트로 구현된 것은 함수형 컴포넌트로도 선언할 수 있다.
// EventPractice.js
import {useState} from 'react';
const EventPractice = () => {
const [username, setUsername] = useState('');
const [message, setMessage] = useState('');
const onChangeUsername = e => setUsername(e.target.value);
const onChangeMessage = e => setMessage(e.target.value);
const onClick = () => {
alert(username + ':' + message);
setUsername('');
setMessage('');
};
const onKeyPress = e => {
if (e.key === 'Enter') {
onClick();
}
};
return (
<div>
<h1>이벤트 연습</h1>
<input
type="text"
name="username"
placeholder="사용자명"
value={username}
onChange={onChangeUsername}
/>
<input
type="text"
name="message"
placeholder="아무거나 입력해보세요"
value={message}
onChange={onChangeMessage}
onKeyPress = {onKeyPress}
/>
<button onClick={onClick}>확인</button>
</div>
);
};
export default EventPractice;
◎다라
[리액트스타터2] 6장. 컴포넌트 반복 (0) | 2022.11.10 |
---|---|
[리액트스타터2] 5장. ref (0) | 2022.11.05 |
[리액트스타터2] 3장. 컴포넌트 (0) | 2022.10.06 |
[리액트스타터2] 2장. JSX (1) | 2022.09.29 |
[리액트스타터2] 1장. 리액트 시작 (1) | 2022.09.29 |