기은P
시간이 멈추는 장소
기은P
  • Programming (272)
    • 개발노트 (1)
    • FrontEnd (56)
      • ES&JS 문법 (14)
      • HTML&CSS (4)
      • React 기본 (18)
      • React 심화 (12)
      • React 이슈 (2)
      • Project 연습 (1)
      • Next.js (5)
    • Backend&Devops (33)
      • AWS (2)
      • Docker (9)
      • Jenkins (6)
      • Nginx (6)
      • Node.js (1)
      • ElasticSearch (5)
      • 프레임워크&아키텍처 (2)
      • 암호화 (0)
      • 기타 (2)
    • 알고리즘 (3)
    • C# (8)
      • WPF (8)
    • Java (51)
      • 순수 Java (18)
      • RDF&Jena (12)
      • RCP&GEF (9)
      • JMX (5)
      • JMapper (3)
      • 오류해결 (4)
    • Database (21)
      • RDBMS (9)
      • NoSQL (2)
      • TSDB (1)
      • GraphQL (1)
      • Hibernate (3)
      • 데이터베이스 이론 (4)
      • Redis (1)
    • 프로토콜 (11)
      • Netty (4)
      • gRPC (5)
      • 프로토콜 개념 (2)
    • Server (4)
      • Linux (4)
    • 2020 정보처리기사 필기 (43)
      • 목차 (1)
      • 기출문제 (1)
      • 1과목 - 소프트웨어 설계 (6)
      • 2과목 - 소프트웨어 개발 (7)
      • 3과목 - 데이터베이스 구축 (8)
      • 4과목 - 프로그래밍 언어 활용 (7)
      • 5과목 - 정보시스템 구축 관리 (10)
    • 2020 정보처리기사 실기 (31)
      • 목차 (4)
      • 기출예상문제 (19)
      • 실기요약 (8)
    • 빅데이터분석기사 필기 (4)
      • 목차 (0)
      • 필기 요약 (3)
    • 전기 공학 (1)
      • CIM (1)
    • 산업자동화시스템 (3)
      • SCADA (1)
      • OPC UA (2)
    • 디자인패턴 (1)
    • 휴지통 (0)

공지사항

  • 공지사항/포스팅 예정 항목

최근 댓글

최근 글

전체 방문자
오늘
어제

티스토리

hELLO · Designed By 정상우.
기은P

시간이 멈추는 장소

[React] React.js 강좌 2. 클래스형 Props & State 정리
FrontEnd/React 기본

[React] React.js 강좌 2. 클래스형 Props & State 정리

2021. 11. 15. 17:02
반응형

클래스형 Props & State 정리

 

 

1. 개념

React에서 자주 사용되는 Props와 State의 개념과 차이점입니다.

 

Props란, 컴포넌트가 가지고 있는 프로퍼티로 자식 컴포넌트가 부모 컴포넌트로부터 값을 받고 싶을 때, props를 통해 받아올 수 있습니다. 일반 객체 지향에서 특정 function의 인자(parameter)로 생각하면 좋습니다.

위는 객체 데이터를 표시하거나 변경 사항등을 알리기 위해 사용되며 읽기전용이므로 값을 수정할 수 없다는 특징을 가지고 있습니다.

 

State는 private한 속성을 지니며 컴포넌트에 의해 완전히 제어되고 있다는 특징을 가지고 있습니다. 즉, 컴포넌트 내부에서만 사용할 수 있는 속성인 것이고, Local State라고도 부릅니다.

 

 

 

 

2. 기초

세 단계의 걸친 예를 보겠습니다.

 

1) render() 메서드에서 state를 사용합니다.

class Clock extends React.Component {
  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}

 

2) 초기 this.state를 지정하는 class constructor, 생성자를 추가합니다

class Clock extends React.Component {
  // 이때 클래스 컴포넌트는 항상 props로 기본 constructor를 호출해야 합니다.
  constructor(props) {
    super(props);
    this.state = {date: new Date()};
  }

  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}

 

3) 마지막으로 ReactDOM.render()에서 컴포넌트를 호출합니다.

ReactDOM.render(
  <Clock />,
  document.getElementById('root')
);

 

 

 

 

3. 다른 컴포넌트에 값을 전달할 때

App.js

/***** App.js (클래스형 컴포넌트) *****/

import React, { Component } from 'react'
import MyComponent from './components/MyComponent';

export default class App extends Component {
  state = {
    value: "프롭스!!!"
  }

  render() {
    return (
      <div>
        <p><MyComponent value="Props!!!" /></p>
        <p><MyComponent value={this.state.value} /></p>
      </div>
    )
  }
}

 

MyComponent.jsx

/***** ./components/MyComponent.jsx (클래스형 컴포넌트) *****/

import React, { Component } from 'react'

export default class MyComponent extends Component {
  render() {
    return this.props.value;
  }
}

 

위 예제에 App.js에서 MyComponent를 호출할 때 this.state.value를 인자로 전달하는 것을 확인해볼 수 있습니다.

App의 state변수에서 value를 “프롭스!!!”로 정의했으므로 출력 결과는

 

Props!!!

프롭스!!!

 

가 나오게 됩니다!

 

 

 

4. 활용

import React from "react";

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0,
    };
  }
  setCount = () => {
count: this.count + 1;
  };

  render() {
    const { count } = this.state;
    return (
      <button onClick={this.setCount}>{count}</button>
    );
  }

 

위 코드를 작성하고 실행을 시켜보면 버튼 객체가 활성화가 되어 있는데, App에서는 버튼을 누르면 props.a의 값이 변경되게 끔 코딩을 해놓았습니다.

하지만 실제로 코드를 실행시키고 버튼을 동작시키면 View에서의 변화는 일어나지 않습니다.

이는 실제로는 변화되었지만, Render가 되지 않았던 것 뿐입니다.

여기서 State란? Component가 갖는 유동적인 데이터로 객체 형태로 존재합니다.

만약 state를 사용해서 View의 값을 실시간으로 바꾸려면 setState({…})을 사용합니다.

위의 코드의 function을 아래와 같이 변경해줍니다.

 

setCount = () => {
this.setState({ count: this.state.count + 1 });
  }

  

그리고 코드를 다시 실행해보면 버튼을 동작시킬 때 View의 변화도 일어나게 됩니다.

즉, setState()는 비동기적으로 함수를 호출하고, setState()가 호출되면 render()가 호출됩니다. State, 즉 지금 상태가 변경되었으니 페이지를 다시 렌더링해라! 라고 리엑트에게 알려주는 것이죠.

 

위 코드는 class 기반으로 생성된 코드이고, 조금 더 간결한 코드를 위해 리액트 훅을 활용한다면 useState함수를 사용해서 아래와 같이 사용할 수 있습니다.

 

import React, { useState } from "react";

function App() {
  //변수와 변수를 설정해주는함수
  const [count, setCount] = useState(0);
  return (
    <div className="App">
      <header className="App-header">
        <button onClick={() => setCount(count + 1)}>{count}</button>
      </header>
    </div>
  );
}

export default App;

 

 

반응형
저작자표시 변경금지 (새창열림)

'FrontEnd > React 기본' 카테고리의 다른 글

[React] React.js 강좌 6. Error Catch  (0) 2021.11.25
[React] React.js 강좌 5. 이벤트 처리, Bind  (0) 2021.11.19
[React] React.js 강좌 4. 생명주기 이벤트  (0) 2021.11.18
[React] React.js 강좌 3. Fragments  (0) 2021.11.18
[React] React.js 강좌 1. 기초 개념 정리  (2) 2021.11.12
    'FrontEnd/React 기본' 카테고리의 다른 글
    • [React] React.js 강좌 5. 이벤트 처리, Bind
    • [React] React.js 강좌 4. 생명주기 이벤트
    • [React] React.js 강좌 3. Fragments
    • [React] React.js 강좌 1. 기초 개념 정리
    기은P
    기은P
    기은P의 블로그 일상과 개발 관련 포스팅 #React #Typescript #Next #Nest https://github.com/kimdongjang

    티스토리툴바