react 스터디에서 리액트를 다루는 기술이라는 책을 선정했고 이 책을 읽고 배운 것을 바탕으로 작성되었다.
Event
: 사용자가 웹 브라우제에서 DOM 요소들과 상호작용하는 것
<MyComponent onClick={doSomething}/>
: props
로 메서드 전달참고: [React] 이벤트 종류
SyntheticEvent 객체
를 전달받습니다.SyntheticEvent 객체
다음과 같은 속성을 가진다.boolean bubbles
boolean cancelable
DOMEventTarget currentTarget
boolean defaultPrevented
number eventPhase
boolean isTrusted
DOMEvent nativeEvent // 브라우저 고유 이벤트
void preventDefault()
boolean isDefaultPrevented()
void stopPropagation()
boolean isPropagationStopped()
void persist()
DOMEventTarget target
number timeStamp
string type
SyntheticEvent 객체
는 풀링된다. 성능상의 이유로 SyntheticEvent 객체
는 재사용되고 모든 속성은 이벤트 핸들러가 호출되고 난 다음 초기화된다. 따라서 비동기적으로 이벤트 객체에 접근할 수 없다.Garbage Collection
이 자주 발생하기 때문에 React는 Object Pool
방식을 사용한다.function handleChange(e) {
// This won't work
setTimeout(() => {
console.log(e.target.value); // Too late!
}, 100);
}
e.persist()
를 호출해야 한다.function handleChange(e) {
// Prevents React from resetting its properties:
e.persist();
setTimeout(() => {
console.log(e.target.value); // Works
}, 100);
}
e.persist()
는 아무런 동작을 하지 않는다.import { useState } from "react";
function EventPractice() {
const [inputs, setInputs] = useState({
username: "",
message: ""
});
// 비구조화 할당을 통해 값 추출
const { username, message } = inputs;
const handleChange = (e) => {
const { name, value } = e.target;
setInputs({
...inputs, // 기존의 inpus 객체 복사한 뒤
[name]: value // 객체 키 동적으로 정의하기 (name 키를 가진 값을 value로 설정, 덮어쓰기)
});
};
const handleClick = () => {
alert(`${username}: ${message}`);
setInputs({
username: "",
message: ""
});
}
const handleKeyPress = (e) => {
if (e.key === "Enter"){
handleClick();
}
}
return (
<div>
<input
type="text"
name="username"
value={username}
onChange={handleChange}/>
<input
type="text"
name="message"
value={message}
onChange={handleChange}
onKeyPress={handleKeyPress}/>
<button >확인</button>
</div>
);
};
export default EventPractice;