React 리액트
컴포넌트(6) 이벤트 핸들러 Event Handler
dev.mk
2023. 9. 7. 16:34
반응형
1. 컴포넌트에서 DOM 이벤트 사용
- 컴포넌트에서 출력된 특정 DOM 객체에 이벤트 컴포넌트가 동작하기 위해선 DOM이벤트 프로퍼티를 사용해야 한다.
- HTML 기존 형식을 카멜식 표기로 변경해서 사용한다.
onclick => onClick
onkeyup => onKeyUp
="" 안에 함수를 쓰는 게 아니라, {}안에 쓴다.
onClick="changeName()" (x)
onClick={changeName} (o)
ex)
import React, { useState } from 'react';
const Main = () => {
const [ myName, setMyName ] = useState("Dev.MK")
function changeName() {
setMyName(myName === "Dev.MK" ? "개발자" : "Dev.MK");
}
return (
<div>
<h1>안녕하세요. {myName} 입니다.</h1>
<button onClick={changeName}>Change</button>
</div>
);
};
export default Main;
함수를 컴포넌트에 직접 선언할 수 도 있다.
import React, { useState } from 'react';
const Main = () => {
const [ myName, setMyName ] = useState("Dev.MK")
return (
<div>
<h1>안녕하세요. {myName} 입니다.</h1>
<button
onClick={() => {
setMyName(myName === "Dev.MK" ? "개발자" : "Dev.MK");
}}>
Change
</button>
</div>
);
};
export default Main;
2. 이벤트의 기본동작 방지 처리
- React에서는 false를 반환해도 기본 동작을 방지할 수 없다.
- 반드시 preventDefault를 명시적으로 호출해야 한다.
ex) Change 클릭시 기본 링크 동작이 수행되어, 주소창에 #이 찍히게 된다.
변경 전
import React, { useState } from 'react';
const Main = () => {
const [ myName, setMyName ] = useState("Dev.MK")
function changeName(e) {
e.preventDefault();
setMyName(myName === "Dev.MK" ? "개발자" : "Dev.MK");
}
return (
<div>
<h1>안녕하세요. {myName} 입니다.</h1>
<a href="#" onClick={changeName}>Change</a>
</div>
);
};
export default Main;
변경 후
import React, { useState } from 'react';
const Main = () => {
const [ myName, setMyName ] = useState("Dev.MK")
function changeName(e) {
e.preventDefault();
setMyName(myName === "Dev.MK" ? "개발자" : "Dev.MK");
}
return (
<div>
<h1>안녕하세요. {myName} 입니다.</h1>
<a href="alert(1);" onClick={changeName}>Change</a>
</div>
);
};
export default Main;
e.preventDefault를 명시적으로 호출하여 기본 링크 동작을 막을 수 있다.
3. 여러가지 예제
인풋값 state에 넣기 + [확인]버튼클릭 알림창
import React, { useState } from 'react';
const EventModule = () => {
const [inputVal, setInputVal] = useState('');
return (
<div>
<input
type="text"
name="inputVal"
placeholder="입력"
value={inputVal}
onChange={
(e) => {
setInputVal(e.target.value);
}
}
/>
<button onClick={
()=> {
alert(inputVal);
setInputVal('');
}
}>확인</button>
</div>
);
};
export default EventModule;
기본적으로 이벤트 리턴값에 e 를 써줄 경우 리액트의 이벤트 객체가 반환된다.
4. 동적인 공통 setState 만들기
import React, { useState } from 'react';
const EventModule2 = () => {
const [inputValues, setInputValues] = useState({
inputName: '',
inputMsg: '',
});
const handleChange = (e) => {
//e 이벤트 객체
// target 이벤트가 발생한 HTML 요소
const { name, value } = e.target; //e.target에서 추출한 HTML 요소에서 name과 value 라는 두 개의 속성을 추출하고 이를 변수 name과 value에 할당
setInputValues({
...inputValues, //inputValues 이객체의 모든 속성과 값을 얕은복사를 한다
[name]: value, //이벤트 핸들러 함수 내에서 현재 입력 필드의 이름과 값에 액세스하기 위해 사용
});
}
const handleClick = () => {
alert(inputValues.inputName + ' / ' + inputValues.inputMsg);
}
const handleReset = () => {
setInputValues({
inputName: '',
inputMsg: '',
});
}
return (
<>
<input
type="text"
name="inputName"
value={inputValues.inputName}
onChange={handleChange}
/>
<input
type="text"
name="inputMsg"
value={inputValues.inputMsg}
onChange={handleChange}
/>
<button onClick={handleClick}>값 확인</button>
<button onClick={handleReset}>리셋</button>
</>
);
};
export default EventModule2;
출처
https://contentstoaster.tistory.com/entry/react-event-handler
https://goddaehee.tistory.com/302
반응형