부스트코스 강의 웹 프론트엔드 시작하기 (리액트&리덕스)
중 'Ch3 state와 props'을 정리한 내용이다.
태그에 속성을 사용할 수 있도록 해준다. HTML에서의 속성은 React에서 "props"라고 한다.
위와 같이 코드 내에 {this.props.title}을 사용해 title="WEB"이라는 속성을 사용할 수 있도록 해준다. 실행 결과는 똑같지만 내부가 더 효율적이게 되었다. 기존 방식은 < Subject>가 매번 똑같은 결과를 나타냈겠지만, 이제 입력값에 따라 다르게 출력을 내보낼 수 있다.
웹 브라우저 상에선 똑같이 동작하지만 전달받은 props에 따라 서로 다른 결과를 만드는 컴포넌트를 만들 수 있게 된 것이다.
import React, { Component } from 'react';
export default TOC;
import TOC from "./components/TOC"
props는 사용자가 컴퍼넌트를 사용하는 입장에서 중요한 것이고, 이를 통해 컴퍼넌트를 조작할 수 있게 된다.
state는 props의 값에 따라 내부의 구현에 필요한 데이터들이다.
component를 만들고 props를 통해 사용자가 조작할 수 있게 해준다.
component 내부적으로 사용되는 것들이 state이다.
props와 state를 철저하게 분리하는 것이 좋은 컴퍼넌트를 만들기 위해 중요하다.
App.js 컴퍼넌트에 < Subject>에는 props 값들이 다음과 같이 하드코딩되어있다.
이 props 값을 state로 만들고 state의 값을 < Subject>의 props로 전달하도록 한다.
먼저 state의 값을 초기화시키고 그 값을 < Subject>의 title, sub에 들어가는 값으로 세팅한다.
state값을 초기화하기 위해 constructor라는 함수를 render()함수 앞에 넣어준다.
this.state={} 코드를 통해 state 값을 초기화 해준다.
Subject의 값을 state화 시키기 위해 this.state에 Subject props의 값으로 객체를 부여한다.
이후 이렇게 만든 state를 기존 subject자리에 다음과 같이 넣어준다.
index.js에는 App 컴퍼넌트를 실행하는 코드가 있지만, 코드만 보고 내부적으로 state값이 subject가 있는지 알 수 없다. 외부에서 알 필요 없는 정보를 철저하게 은닉하면 사용성이 좋아진다.
App 컴퍼넌트를 내부적으로 사용할 상태는 이렇게 'state'라는 형태를 사용하고, state값을 < Subject>컴퍼넌트의 props 값으로 부여해준다.
상위 컴퍼넌트의 state값을 하위 컴퍼넌트의 props값으로 전달하는 것이다.
state에서 여러 값을 다룰 때는 사용법이 조금 달라진다.
매번 < TOC>의 글목록이 추가될 때마다 수정하긴 힘드므로 컴퍼넌트 < APP>의 내부 state를 < TOC>에 주입해 < TOC> 내부 데이터가 자동으로 바뀌도록 수정한다.
contetns라고 하는 property를 state에 추가하고 데이터 객체가 여러 개이기에 대괄호를 열어 배열로 만들어준다.
contetns에 담겨있는 이 배열 정보는 < TOC>에 'data'라고 하는 props로 {this.state.contents}를 주입해준다.
< TOC> 컴퍼넌트는 이제 내부적으로 this.props.data 값을 갖게 되는데, 아래 코드를 이용해 글 목록을 자동으로 생성해주도록 한다.
lists.push( <li key={data[i].id}><a href={"/content"+data[i].id}>{data[i].title}</a></li>);
이렇게 부모인 App의 입장에서는 state라고 하는 내부정보를 사용하고 그것을 자식에게 전달할 때는 props를 통해 전달한다. App에서는 토픽이 내부적으로 어떻게 돌아가는지 알 필요가 없어진다.