<MyComponent onClick={doSomething}/>
<div onClick={this.props.onclick}>
</div>
//EventPractice.js
import React, { Component } from "react";
class EventPractice extends Component {
render() {
return (
<div>
<h1>이벤트연습</h1>
</div>
);
}
}
export default EventPractice;
//App.js
import React from "react";
import EventPractice from "./components/EventPractice";
function App() {
return <EventPractice></EventPractice>;
}
export default App;
//EventPractice.js
import React, { Component } from "react";
class EventPractice extends Component {
render() {
return (
<div>
<h1>이벤트연습</h1>
<input
type="text"
name="message"
placeholder="아무거나 입력해 보세요"
onChange={(e) => {
console.log(e);
}}
></input>
</div>
);
}
}
export default EventPractice;
onChange={(e) => {
console.log(e.target.value);
}}
인풋 값인 e.target.value
를 콘솔에 기록하였다.
//EventPractice.js
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 });
}}
></input>
</div>
);
}
}
export default EventPractice;
생성자 메서드인 constructor에서 state 초깃값을 설정하고, 이벤트 핸들링 함수 내부에서 this.setState 메서드를 호출하여 state를 업데이트한다.
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 });
}}
></input>
<button
onClick={() => {
alert(this.state.message);
this.setState({ message: "" });
}}
>
확인
</button>
</div>
);
}
}
export default EventPractice;
이벤트에 실행할 자바스크립트 코드를 전달하는 것이 아니라, 함수 형태의 값을 전달한다.
메서드 이름은 어떻게 정하지?
마음대로 정해도 되지만, 규칙이 있으면 좋다. handle___ 형식으로 정하면 좋다.
import React, { Component } from "react";
class EventPractice extends Component {
state = {
message: "",
};
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}
></input>
<button onClick={this.handleClick}>확인</button>
</div>
);
}
}
export default EventPractice;
input이 여러 개일 때는 메서드를 여러 개 만들 수도 있지만, event 객체를 활용할 수도 있다. e.target.name을 사용하자.
import React, { 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.setState({
message: "",
});
};
render() {
return (
<div>
<h1>이벤트연습</h1>
<input
type="text"
name="username"
placeholder="사용자명"
value={this.state.username}
onChange={this.handleChange}
></input>
<input
type="text"
name="message"
placeholder="아무거나 입력해 보세요"
value={this.state.message}
onChange={this.handleChange}
></input>
<button onClick={this.handleClick}>확인</button>
</div>
);
}
}
export default EventPractice;
const name = 'Lucy'
일 경우, [key]
는 Lucy가 된다.키를 눌렀을 때 발생하는 keyPress 이벤트
import React, { 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>
<input
type="text"
name="message"
placeholder="아무거나 입력해 보세요"
value={this.state.message}
onChange={this.handleChange}
onKeyPress={this.handleKeyPress}
></input>
<button onClick={this.handleClick}>확인</button>
</div>
);
}
}
export default EventPractice;
// EventPratice.js
import React, { useState } from "react";
const EventPracticeFunction = () => {
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>
<input
type="text"
name="message"
placeholder="아무거나 입력해 보세요"
value={message}
onChange={onChangeMessage}
onKeyPress={onKeyPress}
></input>
<button onClick={onClick}>확인</button>
</div>
);
};
export default EventPracticeFunction;
e.target.name
을 활용하지 않고 onChange 관련 함수 두 개를 따로 만들어주었다.e.target.name
을 활용하는 것이 좋다.이해가 어렵다...
import React, { useState } from "react";
const EventPracticeFunction = () => {
const [form, setForm] = useState({
username: "",
message: "",
});
const { username, message } = form;
const onChange = (e) => {
const nextForm = {
...form, // 기존의 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>
<input
type="text"
name="message"
placeholder="아무거나 입력해 보세요"
value={message}
onChange={onChange}
onKeyPress={onKeyPress}
></input>
<button onClick={onClick}>확인</button>
</div>
);
};
export default EventPracticeFunction;
e.target.name
값을 활용하려면, 위와 같은 useState
를 쓸 때 인풋 값들이 들어 있는 form 객체를 사용해 주면 된다.