-
[React.js] React FormsFront-End(Web)/React - 프레임워크(React, Next) 2020. 12. 1. 22:55반응형
🤷 React.js 프로그래밍을 위한 다양한 스킬들 - 4
지난 포스팅에서는, PropTypes라는 props의 type을 검증하는 라이브러리에 대해 공부했다.
이번에는 React Form에 관해 공부한 내용이다.
기존 React를 쓰지 않은 환경에서는, HTML에 <form> 태그내 <input>, <select> 등 태그에 정보를 입력하였다.
또한, 이 정보를 <button>을 통해 Submit하여 업데이트 처리했지만, 이는 React에서 선호하는 방법이 아니다.
하지만, React Form에선 매 입력/삭제의 순간순간을 서버에서 확인에서 확인하고 스크린을 업데이트 해야하며, 그렇기에 Form과 rest App들이 실시간 연동되어있는게 이상적이다.
📒 Event Listener : onChange
지금까지 <input>에 종종 적용해온 onChange이다. render()의 JSX 태그 내, onChange={this.function} 으로 추가한다.
import React from 'react'; import ReactDOM from 'react-dom'; export class Input extends React.Component { // 3. state 초기화, this bind처리 constructor(props) { super(props); this.state = { userInput: '' }; this.handleUserInput = this.handleUserInput.bind(this) } // 2. handleUserInput(e) 이벤트 핸들러 handleUserInput(e) { this.setState({ userInput: e.target.value }) } render() { return ( <div> // 1. onChange 이벤트리스너 / 4. value={this.state.userInput} <input type="text" value={this.state.userInput} onChange={this.handleUserInput} /> <h1>{this.state.userInput}</h1> </div> ); } } ReactDOM.render( <Input />, document.getElementById('app') );
- render()에 onChange 이벤트 리스너를 추가한다. 여기에, 추후 만들 this.handleUserInput 핸들러를 할당한다.
- handleUserInput(e) 이벤트 핸들러를 추가한다. userInput state를 this.setState()로 변경해준다.
- state 초기화(this.state) 및 this.handleUserInput를 Input 컴포넌트와 .bind 처리한다.
- 마지막으로, <input>의 value 값과 <h1>의 표현내용을 this.state.userInput 과 연결시켜주면 된다.
📒 Controlled vs Uncontrolled
컴포넌트를 구분하는 (클래스형 vs 함수형), (stateful vs stateless) 외 다른 기준이다. React Forms 구분시 적용된다.
- Uncontrolled Component: 초기값을 유지함. 이를 메모리에 기억하면서 정보의 변화를 Tracking 한다.
- Controlled Component: 초기값이 없음. state를 가지고 있지 않아 다른 컴포넌트의 props에 의해 제어된다. React 컴포넌트의 대부분은 Controlled에 해당된다.
React의 정보인지 및 업데이트의 개념은 HTML의 submit과 현저히 달랐다.
글자(Character) 하나하나의 입력/삭제과정을 실시간으로 Tracking 해야하며, 이를 state/props 처리하는 법을 익혔다.
반응형'Front-End(Web) > React - 프레임워크(React, Next)' 카테고리의 다른 글
[React.js] Hooks - useReducer (0) 2020.12.26 [React.js] Hooks - useContext (Context API) (0) 2020.12.25 [React.js/Side Lib.] PropTypes (0) 2020.12.01 [React.js] Components Seperation (0) 2020.12.01 [React.js] Inline Style (0) 2020.11.30