요소 | 값 속성 | 값을 변경하는 콜백 | 콜백의 새 값 |
---|---|---|---|
<input type=”text” /> | value=”string” | onChange | e.target.value |
<input type=”checkbox” /> | checked={boolean} | onChange | e.target.checked |
<input type=”radio” /> | checked={boolean} | onChange | e.target.value |
<textarea /> | value=”string” | onChange | e.target.value |
<select /> | value=”option value” | onChange | e.target.value |
import React, { useState } from "react";
export default function App() {
const [username, setUsername] = useState("");
const [msg, setMsg] = useState("");
return (
<div className="App">
<div>{username}</div>
<input
type="text"
value={username}
onChange={(event) => setUsername(event.target.value)}
placeholder="여기는 인풋입니다."
className="tweetForm__input--username"
></input>
<div>{msg}</div>
<textarea
placeholder="여기는 텍스트 영역입니다."
className="tweetForm__input--message"
onChange={(event) => setMsg(event.target.value)}
value={msg}
></textarea>
</div>
);
}
ref
를 통해 값을 가져옴기준 | 제어 컴포넌트 | 비제어 컴포넌트 |
---|---|---|
일회성 값 검색 (ex. 제출할 때) | O | O |
제출 시 유효성 검사 (ex. email과 같은 형태의 데이터) | O | O |
즉각적인 필드 유효성 검사 | X | O |
조건부 제출 버튼 비활성화 (ex. ID&PW 입력했을 때만 제출 버튼 활성화) | X | O |
입력 형식 적용 (ex. 숫자만 입력 가능함) | X | O |
하나의 데이터에 대한 여러 입력 | X | O |
동적 입력 | X | O |
()
와 함께 함수를 호출한다면, 리턴값이 onClick으로 전달되어서 함수 자체가 전달되는 것이 아니라, 함수의 결과값이 전달되므로 함수 자체를 전달해야함. ()
와 함께 함수를 호출한다면 렌더링할 때마다 해당 함수가 호출되기 때문에 성능 이슈가 발생할 수 있음<button onClick={handleEvent}>Event</button>
<input>
, <textarea>
, <select>
) onChange
이벤트가 발생하면 e.target.value
를 통해 이벤트 객체에 담겨있는 input
값을 읽음input
태그에 value
와 onChange
를 넣어줌onChange
는 input
의 텍스트가 바뀔 때마다 발생하는 이벤트handleChange
함수가 작동하며, 이벤트 객체에 담긴 input
값을 setState
를 통해 새로운 state 로 갱신function NameForm() {
const [name, setName] = useState("");
const handleChange = (e) => {
setName(e.target.value);
}
return (
<div>
<input type="text" value={name} onChange={handleChange}></input>>
<h1>{name}</h1>
</div>
)
};
<a>
를 통한 링크 이동 등과 같이 주로 사용자의 행동에 따라 애플리케이션이 반응해야 할 때 자주 사용하는 이벤트onClick
이벤트에 함수를 전달할 때는 함수를 호출하는 것이 아닌, 리턴문 안에서 함수를 정의하거나 리턴문 외부에서 함수를 정의 후 이벤트에 함수 자체를 전달해야함function NameForm() {
const [name, setName] = useState("");
const handleChange = (e) => {
setName(e.target.value);
}
//리턴문 안에서 함수 정의하기
return (
<div>
<input type="text" value={name} onChange={handleChange}></input>
<button onClick={() => alert(name)}>Button</button>
<h1>{name}</h1>
</div>
)
};
function NameForm() {
const [name, setName] = useState("");
const handleChange = (e) => {
setName(e.target.value);
}
//함수 자체를 전달하기
const handleClick = () => {
alert(name);
};
return (
<div>
<input type="text" value={name} onChange={handleChange}></input>
<button onClick={handleClick}>Button</button>
<h1>{name}</h1>
</div>
)
};
select
tag는 사용자가 drop down 목록을 열어 그중 한 가지 옵션을 선택하면, 선택된 옵션이 state 변수에 갱신됨
function SelectExample() {
const [choice, setChoice] = useState("apple");
const fruits = ["apple", "orange", "pineapple", "strawberry", "grape"];
const options = fruits.map((fruit) => {
return <option value={fruit}>{fruit}</option>;
});
const handleFruit = (event) => {
setChoice(event.target.value);
};
return (
<div className="App">
<select onChange={handleFruit}>{options}</select>
<h3>You choose "{choice}"</h3>
</div>
);
}
Pop up 의 open 과 close 를 state 를 통해 관리
function App() {
const [showPopup, setShowPopup] = useState(false);
const togglePopup = () => {
if(showPopup === false) {
setShowPopup(true);
}else {
setShowPopup(false);
}
};
return (
<div className="App">
<h1>Fix me to open Pop Up</h1>
<button className="open" onClick={togglePopup}>Open me</button>
{showPopup ? (
<div className="popup">
<div className="popup_inner">
<h2>Success!</h2>
<button className="close" onClick={togglePopup}>
Close me
</button>
</div>
</div>
) : null}
</div>
);
}
참고 사이트
Controlled and uncontrolled form inputs in React don't have to be complicated