기술개발/React, Frontend

리액트 - form을 통해 데이터 넘기기

한승욱 2021. 3. 10. 20:14
반응형

(주의!!)본 글은 현재 시점에서는 레거시한 '클래스 컴포넌트'를 공부하며 작성한 글입니다.

form

  • 실제 서비스에서는 form을 통해 유저에게 데이터를 받고 또 해당 데이터를 서버로 옮겨주는 일이 빈번하다. 이와 같은 부분을 공부하고자 한다.
# pages/about.jsx
import React from 'react';

class About extends React.Component {
  constructor(props) {
    super(props);
    this.state = { username: '' };
  }

  myChangeHandler = evt => {
    this.setState({ username: evt.target.value });
  };

  doSave = () => {
    const { username } = this.state;
    alert(username);
  };

  render() {
    return (
      <div>
        <p>Enter yout name:</p>
        <input type="text" onChange={this.myChangeHandler} />
        <button type="button" className="btn btn-primary" onClick={this.doSave}>
          저장
        </button>
      </div>
    );
  }
}
export default About;

  • 사용자가 키워드를 입력하는 순간에 setState 메소드를 호출해주면서 state의 username에 사용자가 입력한 값을 넣어준다.

정리하자면 onChange로 해서 불러주고 state에 값을 넣어서 구성을 해주는 것이다.

테이블 활용

  • 실제 서버에서 데이터를 받아왔다는 것을 가정하기 위해 배열과 테이블을 활용하기로 한다.
import React from 'react';

class Row extends React.Component {
  render() {
    const { name, email } = this.props;
    return (
      <tr>
        <td>{name}</td>
        <td>{email}</td>
      </tr>
    );
  }
}

class About extends React.Component {
  constructor(props) {
    super(props);
    this.state = { username: '' };
  }

  myChangeHandler = evt => {
    this.setState({ username: evt.target.value });
  };

  doSave = () => {
    const { username } = this.state;
    alert(username);
  };

  render() {
    const data = [
      { name: 'A', email: 'a' },
      { name: 'B', email: 'b' },
      { name: 'C', email: 'c' },
    ]; // 서버에서 데이터를 가져왔다고 가정
    const rows = data.map(row => <Row name={row.name} email={row.email} />);

    return (
      <div>
        <p>Enter yout name:</p>
        <input type="text" onChange={this.myChangeHandler} />
        <button type="button" className="btn btn-primary" onClick={this.doSave}>
          저장
        </button>

        <table className="table table-bordered">
          <thead>
            <tr>
              <th>Name</th>
              <th>Email</th>
            </tr>
          </thead>
          <tbody>{rows}</tbody>
        </table>
      </div>
    );
  }
}
export default About;
  • Row 클래스에서는 props로 name과 email을 전달할 수 있게 구성.
  • rows 에서는 map을 통해 data 배열을 3번 돌면서 Row라는 클래스 컴포넌트를 3번 호출하며 props 값들을 전달.
  • 리턴값들을 rows에 다시 담아서 테이블에서 출력.

응용

  • 위 form에서 name, email을 입력 받으면 아래 표에 채워지게 진행해보자.
반응형