본문 바로가기
Frontend/React

8. 제어 컴포넌트

by 예린lynn 2024. 8. 1.
728x90

 

Controlled Components (제어 컴포넌트)는 값이 리액트의 통제를 받는 Input Form Element이다.

  • HTML 폼에서는 각 엘리먼트가 자체적으로 state를 관리한다. 이 경우 자바스크립트 코드를 통해 각각의 값에 접근하기 어렵다.
  • 제어 컴포넌트에서는 모든 데이터를 state에서 관리한다. 사용자의 입력을 직접적으로 제어할 수 있다.

 

 

 

input 태그

사용자 입력이 발생하면 event 객체를 이용해 setState()를 호출하여 사용자의 입력을 자신의 state로 저장하고, 상태값을 엘리먼트의 value 속성값으로 나타낸다.

 

export default function App(){
	const [input, setInput] = useState("");
    const onChange = (e) => {
        setInput(e.target.value);
    };
    return (
    	<form>
      		<input onChange={onChange} value={input} />
    	</form>
  	);
}

 

- 예시2

모든 입력값을 대문자로 변경하는 코드. handleChange를 통해 들어오는 event의 target value를 toUpperCase를 사용해서 대문자로 변경한 다음 그 값을 state에 저장한다.

const handleChange = (event) => {
  setValue(event.target.value.toUpperCase());
}

 

 

Textarea 태그

여러 줄에 걸쳐 긴 텍스트를 입력받기 위한 html 태그

 

- HTML textarea 태그

<textarea>
  여기에 텍스트가 입력됩니다.
</textarea>

 

- 예시

function RequestForm(props){
 const [value, setValue] = useState('요청사항을 입력하세요');
 
 const handleChange = (event) => {
   setValue(event.target.value);
 }
 
  return (
    <form onSubmit={handleSubmit}>
      <label>
        요청사항:
        <textarea value={value} onChange=handleChange/>
       </label>
     </form>  
  )
 }

 

 

Select 태그

 drop-down 목록(여러가지 옵션 중 선택)을 보여주기 위한 html 태그

 

- HTML select 태그

//선택된 값은 selected로 표시
<select>
  <option value="apple">사과</option>
  <option selected value='grape'>포도</option>
</select>

 

- 예시

function FruitSelect(props) {
  const [value, setValue] = useState('grape');
  
  const handleChange = (event) => {
    setValue(event.target.value);
  }
  
  return (
    <form onSubmit={handleSubmit}>
      <label>
        과일을 선택하세요:
        <select value = {value} onChange={handleChange}>
          <option value="apple">사과</option>
          <option value="grape">포도</option>
        </select>
      </label>
    </form>  
  )
}

 

- 다중 선택

//multiple 사용
<select multiple={true} value={['B','C']}>

 

 

정리

//input 태그
<input type="text" value={value} onChange={handleChange} />

//textarea 태그
<textarea value={value} onChange={handleChange} />

//select 태그
 <select value = {value} onChange={handleChange}>
          <option value="apple">사과</option>
          <option value="grape">포도</option>
 </select>

 

 

NULL

제어 컴포넌트에 value prop 을 정해진 값으로 넣으면 코드를 수정하지 않는 한 입력값을 바꿀 수 없다.

만약 value prop을 넣되 자유롭게 입력할 수 있게 만들고 싶다면 값에 undefined 또는 null을 넣으면 된다.

const root = ReactDOM.createRoot(rootNode);
root.render(<input value="hi" />);

setTimeout(function() {
  root.render(<input value={null} />);
}, 1000);

 

 

728x90

'Frontend > React' 카테고리의 다른 글

9. 합성 (Composition)  (0) 2024.08.01
7. key, map  (0) 2024.08.01
6. 조건부 렌더링  (0) 2024.08.01
5. Hooks  (0) 2024.08.01
4. State, Lifecycle  (0) 2024.07.30