ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • state 개념잡기
    프론트엔드/react(생활코딩) 2020. 1. 17. 18:07

    기존에는, class App 부분에 props 값이 바로 하드코딩되어서 들어갔다. 하지만 이는 좋지 않다. 내부적으로 구동되는 부분을 최대한 뒤로 숨기게 하는 것이 좋은데, 이를 state 가 담당한다. 아래 코딩 내용 참고

    import React, { Component } from 'react';
    import './App.css';
    import TOC from "./components/TOC";
    import Subject from "./components/Subject";
    import Content from "./components/Content";
    
    
    class App extends Component {
      constructor(props) {
        super(props);
        this.state = {
          subject: { title: "WEB", sub: "World Wide Web!" }
        }
      }
      render() {
        return (
          <div className="App">
            <Subject title={this.state.subject.title} sub={this.state.subject.sub}></Subject>
            <TOC></TOC>
            <Content title="HTML" desc="HTML is HyperText Markup Language."></Content>
          </div>
        );
      }
    }
    
    export default App;

    key의 개념을 잡아 보자. 컴포넌트 TOC 에는 기존에 클래스부분에 내용이 하드코딩이 되어 있다.

    state를 초기화를 통해 이를 자동으로 구현될 수 있도록 해보자.

     

    class App 부분 코딩

    import React, { Component } from 'react';
    import TOC from "./components/TOC";
    import Content from "./components/Content"
    import Subject from "./components/Subject"
    import './App.css';
    
    
    class App extends Component {
      constructor(props) {
        super(props);
        this.state = {
          subject: { title: 'WEB', sub: 'World Wid Web!' },
          contents: [
            { id: 1, title: 'HTML', desc: 'HTML is for information' },
            { id: 2, title: 'CSS', desc: 'CSS is for design' },
            { id: 3, title: 'JavaScript', desc: 'JavaScript is for interactive' }
          ]
        }
      }
      render() {
        return (
          <div className="App">
            <Subject
              title={this.state.subject.title}
              sub={this.state.subject.sub}>
            </Subject>
            <TOC data={this.state.contents}></TOC>
            <Content title="HTML" desc="HTML is HyperText Markup Language."></Content>
          </div>
        );
      }
    }
    
    export default App;

    위 내용중에 TOC data 부분을 자세히 살펴 보자.

     

    1) data={this.state.contents}의 뜻은, TOC에 props에 data라는 값을 준 것이다. state의 contents 부분에는

    배열에 각 객체가 들어가 있고, 각 객체에는 id 값, title값, desc값이 들어가 있다.

     

    2) TOC 컴포넌트는 아래와 같이 구성 되어 있다. (복수의 엘레멘트에는 key 활용)

    이를 설명하면, lists라는 배열을 만들었고, lists안에 각 객체들이 하나씩 들어가는 알고리즘이다.

    코딩 흐름은,

     

    (1) lists 배열화

    (2) data 변수 선언 = this.props.data (위 App 컴포넌트의 하위 TOC 부분의 data - 여기에는 현재 3개의 객체가 들어가 있음)

    (3) 반복문 - data.lenth = 3이기 때문에 초기 i 값은 0이며  i= 0 ~ 2까지 진행 된다.

    i = 0부터 흐름을 보자. i가 0일 경우, lists.push를 통해 (1)의 배열에 특정 조건에 맞는 값이 들어 간다. 이때 조건을 하나씩 뜯어서 분석해 보자.

     

    a) key={data[0].id}, 이 뜻은 key는 각 객체에는 고유번호가 들어가야 하는데, 이를 정의 해주는 것이다. 다시말해, data[0]은 컴포넌트 state의 contents의 첫번째 객체를 가리킨다.  따라서 contents의 첫번째 객체 id 값 즉 id = 1을 말한다.

     

    b) a href={"/content/" + data[0].id}, 이 뜻은 url 값을 지정해주는 것이고, a) 와 같은 흐름이다.

     

    c) data[0].title 역시 위와 같은 흐름이다.

     

    최종적으로 반복문으로 총 3개의 객체를 lists에 넣어 두었고, return 값에 {lists}를 선언함으로써, 각 객체 값이 <ul> {lists} </ul> 구문에 들어 가게 된다.

    import React, { Component } from 'react';
    
    class TOC extends Component {
        render() {
            var lists = [];
            var data = this.props.data;
            var i = 0;
            while (i < data.length) {
                lists.push(<li key={data[i].id}><a href={"/content/" + data[i].id}>{data[i].title}</a></li>);
                i = i + 1;
            }
            return (
                <nav>
                    <ul>
                        {lists}
                    </ul>
                </nav>
            );
        }
    }
    
    export default TOC;

    지금 까지 배운걸로 미루어보아,

     

    컴포넌트는 말그대로 부품으로 어떤 어플리케이션에서도 재활용 될 수 있게 기본 틀을 제공해주는 역할을 해야 한다. 따라서 컴포넌트부분에 하드코딩이 되어 있으면 안된다. (props를 통해)

     

    다시 말해, 특정 값은 state에 정의 되어야 하고, 그 state값이 App 컴포넌트에 들어가고, App 컴포넌트는 하위 컴포넌트들의 값들을 가져오는 식으로 구성이 되어야 하는 것 같다. 이때 하위 컴포넌트 값들은 앞서 말한대로 props를 통해 state에 정의된 특정 값을 가져 오는 로직으로 구성 되어야한다.

     

    '프론트엔드 > react(생활코딩)' 카테고리의 다른 글

    Create만들기 (전체 정리)  (0) 2020.02.10
    이벤트  (0) 2020.01.18
    컴포넌트 파일로 쪼개기(4)  (0) 2020.01.17
    props 만들기(3)  (0) 2020.01.17
    컴포넌트 만들기(2)  (0) 2020.01.16
Designed by Tistory.