Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Joon's Space

[React] Component, Props, State (생활코딩) 본문

Web/React

[React] Component, Props, State (생활코딩)

Happy Joon 2021. 5. 7. 20:48

1. Component 

 

1.1 Component를 사용하는 이유? 

-> 리액트는 HTML 태그 구조를 각 Component 로 분리하는데, 이렇게 하면 중복 코드들을 최소화시키고, 유지보수도 용이하게 해 준다. (객체지향 언어의 특징) 

 

<pure.html>

<html>
  <body>
    <header>
      <h1>WEB</h1>
      world wide web!
    </header>

    <nav>
      <ul>
        <li><a href="1.html">HTML</a></li>
        <li><a href="2.html">CSS</a></li>
        <li><a href="3.html">JavaScript</a></li>
      </ul>
    </nav>

    <article>
      <h2>HTML</h2>
      HTML is HyperText Markup Language.
    </article>
  </body>
</html>

다음과 같은 pure.html 을 react에서 HTML semantic 태그들 (header, nav, article, etc)을 각 class Component로 App.js 에 생성해준다.  

 

1.2 Component 기본 생성법 (기본 구조) 

class Hello extends Component {
  render() {
    return (
      <h1>
        Hello!
      </h1>
    );
  }
}

Component는 위와같은 기본구조를 갖고 있는데, render라는 함수의 return 안에 각 HTML 코드들을 삽입해 주면 이 Component를 export 할 class App 컴포넌트 안에서 사용할 수 있다. 이 외에도 function으로도 Component를 생성할 수 있지만 강의에선 class를 사용하였다. 

 

<App.js>

import React, { Component } from 'react'; // 리액트의 모듈을 import 해준다. 
import './App.css';

class Subject extends Component { // header 부분 
  render() {
    return (
      <header>
        <h1>WEB</h1>
        world wide web!
      </header>
    );
  }
}


class TOC extends Component { // nav 부분
  render() {
    return (
      <nav>
        <ul>
          <li><a href="1.html">HTML</a></li>
          <li><a href="2.html">CSS</a></li>
          <li><a href="3.html">JavaScript</a></li>
        </ul>
    </nav>
    );
  }
}

class Content extends Component { // article 부분 
  render() {
    return (
      <article>
        <h2>HTML</h2>
        HTML is HyperText Markup Language.
      </article>
    );
  }
}


class App extends Component { // 이 부분이 index.html 에 들어갈 부분
  render() {
    return (
      <div className="App">
        <Subject></Subject>
        <TOC></TOC>
        <Content></Content>
      </div>
    );
  }
}


export default App;

 

 

1.3 Component 분리하기

- Component 들을 App.js 에 모두 붙여놓으면 코드가 너무 길고 복잡해 질 수 있으므로, 컴포넌트들을 각각 하나의 파일에 나누어서 사용하기로 한다. 각 component 들을 

 

ex)

<TOC.js>

import React, { Component } from 'react';

class TOC extends Component {
    render() {
      return (
        <nav>
          <ul>
            <li><a href="1.html">HTML</a></li>
            <li><a href="2.html">CSS</a></li>
            <li><a href="3.html">JavaScript</a></li>
          </ul>
      </nav>
      );
    }
  }

export default TOC;

 

<Contents.js>

import React, { Component } from 'react';

class Content extends Component {
    render() {
      return (
        <article>
          <h2>{this.props.title}</h2>
          {this.props.desc}
        </article>
      );
    }
  }

export default Content;

 

<Subject.js>

import React, { Component } from 'react';

class Subject extends Component {
    render() {
      return (
        <header>
          <h1>{this.props.title}</h1>
          {this.props.sub}
        </header>
      );
    }
  }

export default Subject

 

<App.js>

import React, { Component } from 'react';
import Subject from "./components/Subject";
import Content from "./components/Contents";
import TOC from "./components/TOC";
import './App.css';


class App extends Component {
  render() {
    return (
      <div className="App">
        <Subject title="WEB" sub="world wide web!"></Subject>
        <Subject title="React" sub="For UI"></Subject>
        <TOC></TOC>
        <Content title="HTML" desc="HTML is HyperText Language."></Content>
      </div>
    );
  }
}


export default App;

 

각 Component 파일들은 App.js 에서처럼 필요한 모듈들을 import하고, 외부에서 사용할 수 있도록 export 해준다. (중요)

그런 다음, App.js 에서 사용할 component 의 경로를 입력하여 component의 class 이름으로 import 해주어 사용한다.


다음 나오는 두가지 개념 props, state는 component에서 사용하는 데이터의 종류들이다. 각 데이터의 사용 용도에 따라 props을 사용하기도 하고, state를 사용하기도 한다. 

 

2. Props

- 부모 component가 자식 component에게 값을 전달할 때 사용하는 것. (state와 달리 값을 변경할 수 없음)

 

2.1 props 사용 방법 예

 

<Subject.js>

import React, { Component } from 'react';

class Subject extends Component {
    render() {
      return (
        <header>
          <h1>{this.props.title}</h1> // this는 자기자신이고 외부에서 이 Subject Component를 사용할 때, title의 값을 받아옴
          {this.props.sub}
        </header>
      );
    }
  }

export default Subject

<App.js>

import React, { Component } from 'react';
import Subject from "./components/Subject";
import Content from "./components/Contents";
import TOC from "./components/TOC";
import './App.css';


class App extends Component {
  render() {
    return (
      <div className="App">
        <Subject title="WEB" sub="world wide web!"></Subject>
        <Subject title="React" sub="For UI"></Subject>
        <TOC></TOC>
        <Content title="HTML" desc="HTML is HyperText Language."></Content>
      </div>
    );
  }
}


export default App;

 

className App div 안에서 각 Component를 사용할 때, 변수="값"을 입력해주면, 자식 Component HTML 태그에서 그 변수에 해당하는 위치에 값이 들어가게 된다. 


3. State

- 읽기 전용 데이터인 props 와 달리 state는 component 안에서 mutable 하게 사용이 가능하다. 

 

3.1 state 사용하기 

 

<app.js>

class App extends Component {
  constructor(props){ // component가 실행될 때 constructor함수가 제일 먼저 실행되어서 초기화를 담당 
    super(props);
    this.state = {
      mode:'read',
      subject:{title:'WEB', sub:'World Wide Web!'},
      welcome:{title:'Welcome', desc:'Hello, React!!'},
      contents:[
        {id:1, title:'HTML', desc:'HTML is for information'},
        {id:2, title:'CSS', desc:'CSS is for design'},
        {id:3, title:'JavaSciprt', desc:'JavaScript is for interactive'}
      ]
    }
  }
  render() {
    console.log('App render');
    var _title, _desc = null;
    if(this.state.mode === 'welcome'){
      _title = this.state.welcome.title;
      _desc = this.state.welcome.desc;
    } else if(this.state.mode === 'read'){
      _title = this.state.contents[0].title;
      _desc = this.state.contents[0].desc;
    }
    return (
      <div className="App">
        <Subject 
          title={this.state.subject.title} 
          sub={this.state.subject.sub}> 
        </Subject>
        <TOC data={this.state.contents}></TOC>
        <Content title={_title} desc={_desc}></Content>
      </div>
    );
  }
}

state는 constructor 함수는 component가 실행되면 제일 먼저 실행되어 state를 초기화한다. 그리고 super(props)는 습관적으로 적어주는데, 그 이유는 자바스크립트에서 super 를 호출하기 전에는 thisthis를 사용할 수 없기 때문. 

반응형