
React에 대한 개인학습을 기록합니다.
체크리스트
| ☑ | TITLE | 
| ✔ | 연습용 레포 생성 | 
| ✔ | 리액트 개요 확인 | 
| ✔ | JSX다루기 | 
| ✔ | 리액트 컴포넌트 | 
| ✔ | 리액트 스타일링 | 
| ✔ | 컴포넌트 복잡하게 다루기 | 
| 속성 전달 | |
| JSX 복잡하게 다루기 | |
| 상태 다루기, 카운터 설정 | |
| 데이터를 UI로 불러오기 | |
| 이벤트 다루기 | |
| 컴포넌트 생명주기 (생명주기 메소드) | |
| DOM 엘리먼트 접근하기 | |
| 라우터를 통한 싱글 페이지 앱 구축 | |
| Todo list 앱 제작 | |
| 리액트 개발 환경 구성 | 
4. Rreact 스타일링
4.1. 개요
4.1.1. CSS(cascading Style Sheets)에 대하여
- 콘텐츠와 프레젠테이션 사이를 잘 분리할 수 있음
- 셀렉터(selector)문법을 통해 스타일 적용과 건너뛸 엘리먼트를 유연하게 선택하도록함
4.1.2. 리액트가 가진 콘텐츠 스타일 적용 견해 (vs CSS)
- 앱의 비주얼 부품은 독립적이며 재사용 가능해야 한다
- HTML엘리먼트와 js를 컴포넌트 하나에 담았던 이유이다.
4.1.3. HTML 엘리먼트에 스타일 적용법
- 어떤 UI컴포넌트를 위한 스타일이 다른 곳에 있따면 독립적 UI컴포넌트가 될 순 없다
- 리액트가 HTML과 JS의 바로 옆에서 엘리먼트 스타일 지정을 권하는 이유이다.
⇒ 콘텐츠에 스타일을 지정하는 방식을 알아보자
⇒ CSS 사용 방식도 같이 알아보자
⇒ 언제나 두 방식 모두를 사용할 수 있다
4.2. 실습: 영어 모음 보여주기
4.2.1. 초기 코드
<!DOCYPE html>
<html>
<head>
    <title>kyuStyle in React</title>
    <script src="https://unpkg.com/react@15.3.2/dist/react.js"></script>
    <script src="https://unpkg.com/react-dom@15.3.2/dist/react-dom.js"></script>
    <script src="https://cdnjs.Cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
    <style> //기본 스타일
        #container {
            padding: 50px;
            background-color: #FFF;
        }
    </style>
</head>
<body>
    <div id="container"></div>
</body>
</html>- 리액트와 바벨 라이브러리를 로드한 상태
- container란 id값을 가진 div를 지정한 상태
4.2.2. 화면에 모음 글자를 보여주기 위한 React코드 추가
<div id="container">
        <script type="text/babel">
            var Letter = React.createClass({
                render: function() {
                    return (
                        <div>
                            {this.props.children}
                        </div>
                    );
                }
            });
            var destination = document.querySelector("#container");
            ReactDOM.render(
                <div>
                    <Letter>G</Letter>
                    <Letter>Y</Letter>
                    <Letter>U</Letter>
                    <Letter>R</Letter>
                    <Letter>Y</Letter>
                </div>,
                destination
            );
        </script>
    </div>- div엘리먼트 안에 각 모음 글자를 감싸는 Letter 컴포넌트 제작
- script태그를 통해 HTML에 고정되어 있음
- 바벨이 이해할 수 있는 형태로 작성됨

4.3. CSS를 사용한 리액트 콘텐츠 스타일링
4.3.1. 이전 HTMl 내용 이해하기
//ReactDOM기반 render메소드 내용
<div>
  <Letter>G</Letter>
  <Letter>Y</Letter>
  <Letter>U</Letter>
  <Letter>R</Letter>
  <Letter>Y</Letter>
</div>// Letter 컴포넌트 안 render 메소드
<div>
	{this.props.children}
</div>- div를 포함한 여러 JSX코드 조각이 아래와 같이 HTML로 바뀐다. (ft. 개발자모드)

4.3.2. Letter 값에 class 속성을 가지도록 하기
var Letter = React.createClass({
                render: function() {
                    return (
                <div className="letter"> {/* 클래스 속성 가지도록 만들기 */}
                            {this.props.children}
                        </div>
                    );
                }
            });- class가 아닌 className
- className은 JS의 특별한 키워드임
 
4.3.3. 리액트 방식의 스타일링 하기: 스타일 객체 만들기
//기존의 css혀식
.letter {
    padding: 10,
    margin: 10,
    background-color: "#ffde00",
    color: "#333" ,
    display: "inline-block",
    font-family: "monospace",
    font-size: 32,
    text-align: "center"
}
//JS
render: function() {
	var letterStyle = {
    padding: 10,
    margin: 10,
    backgroundColor: "#ffde00",
    color: "#333" ,
    display: "inline-block",
    fontFamily: "monospace",
    fontSize: 32,
    textAlign: "center"
	};
- CSS속성을 JS방식으로 변환하는 공식
- 한 단어의 CSS속성(padding, margin, color 등)은 그대로 쓰기
- 대시로 연결된 여러 단어의 CSS은 카멜 표기법으로 바꿔주기
- ex) font-family → fontFamily
 
- 접미사 ‘px’ 는 생략하여 작성하고 있음
- 리액트는 자동으로 px를 붙여줌.
- 숫자 값을 갖는 속성이지만 리액트가 픽셀 접미사를 자동으로 붙이지 않는 속성
 - columnCount, fillOpacity, flex, flexGrow, flexShrink, fontWeight, lineClamp, lineHeight, opacity, order, orphans, windows, zIndex, zoom
 
4.3.4. 리액트 방식의 스타일링하기: 콘텐츠 스타일링하기
//기존 코드
return (
    <div className="letter"> {/* 클래스 속성 가지도록 만들기 */}
        {this.props.children}
    </div>
);
//수정 코드
return (
    <div style={letterStyle}> {/* 클래스 속성 가지도록 만들기 */}
        {this.props.children}
    </div>
);


각 스타일이 인라인으로 적용되어있음
4.3.5. 배경색 커스터마이징
// render 안의 letterStyle 수정
backgroundColor: this.props.bgcolor,
// ReactDom.render메소드에서 bgcolor 속성을 추가하고 각 색을 지정
<div>
    <Letter bgcolor="#58B3FF">G</Letter>
    <Letter bgcolor="#FF605F">Y</Letter>
    <Letter bgcolor="#FFD52E">U</Letter>
    <Letter bgcolor="#49DD8E">R</Letter>
    <Letter bgcolor="#AE99FF">Y</Letter>
</div>,

4.4. 총정리
- CSS스타일 규칙 사용법과는 다른, 리액트가 JS에서 인라인 방식으로 스타일링하는 방법이 있다
- HTML과 닮은 XML문법을 통해 JS에서 UI통째로 선언하는 방법을 JSX로 배웠었다
5. 복잡한 컴포넌트 제작하기 : 컬러 팔레트
5.1. 비주얼 요소 식별하기
: 나는 사진자료가 없지만, 이렇게 글로 써놓은 것을 트리구조로 생각해보자.
| 
 | 
5.1.1. 컴포넌트로 만들 비주얼 요소 선별 기법
- 한 컴포넌트는 한 역할만 해야 한다
- 만드려는 컴포넌트가 너무 많은 일을 하게 될 것 같다면 여러 컴포넌트로 쪼갬
- 컴포넌트가 너무 적은 일을 하게 될 것 같으면 아예 비주얼 요소를 컴포넌트로 만들려 하지 않음
 
- 위의 이론을 바탕으로면, 5.1.의 흰색 바탕 영역이 거슬린다
- 단순히 빈공간이라고 생각하면 레이블에게 맡겨도 되는 역할이다
- 즉, 흰색 바탕 영역은 컴포넌트가 될 수 없는 대상이었음.
 
- 그러니, ‘카드 자체 영역’, ‘특정 컬러를 나타내는 사각형 영역’, ‘색상카드를 보여주는 레이블 영역’ 3가지가 최종 컴포넌트다.
5.2. 컴포넌트 작성하기
5.2.1. 초기코드
<!DOCYPE html>
<html>
<head>
    <title>Complicated-KyuComponent</title>
    <script src="https://unpkg.com/react@15.3.2/dist/react.js"></script>
    <script src="https://unpkg.com/react-dom@15.3.2/dist/react-dom.js"></script>
    <script src="https://cdnjs.Cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
    <style>
        #container {
            padding: 50px;
            background-color: #FFF;
        }
    </style>
</head>
<body>
    <div id="container"></div>
    <script type="text/babel">
        ReactDOM.render(
            <div>
            </div>,
            document.querySelector("#container")
        );
    </script>
</body>
</html>5.2.2. Card 컴포넌트 만들기
// Script 내의 Card 컴포넌트 작성
var Card = React.createClass({
    render: function(){
        var cardStyle = {
            hight: 200,
            width: 150,
            padding: 0,
            backgroundColor: "#FFF",
            WebkitFilter: "drop-sqdow(0px 0px 5px #666)",
            filter: "drop-shadow(0px 0px 5px #666)"
        };
        return(
            <div style={cardStyle}>
            </div>
        );
    }
});
//ReactDom.render수정
ReactDOM.render(
      <div>
        <Card/> {/* Card 추가해줌 */}
    </div>,
    document.querySelector("#container")
);
5.2.3. Square 컴포넌트 만들기
// Script 내의 Square 컴포넌트 작성
var Square = React.createClass({
      render: function() {
          var squareStyle = {
              height: 150,
              backgroundColor: "#FF6663"
          };
          return(
              <div style={squareStyle}>
              </div>
          );
      }
  });
// Card 컴포넌트 내의 return 수정
return(
    <div style={cardStyle}>
        <Square/> {/* square와 결합하기 */}
    </div>
);
5.2.4. Label 컴포넌트 만들기
// script 내의 Square 컴포넌트 작성
var Label = React.createClass({
    render: function() {
        var labelStyle = {
            fontFamily: "sans-serif",
            fontWeight: "bold",
            padding: 13,
            margin: 0
        };
        return( 
            <p style={labelStyle}>#FF6663</p> // 적용시키기
        );
    }
});
// Card 컴포넌트 내의 return 수정
return(
    <div style={cardStyle}>
        <Square/>
        <Label/>
    </div>
);
5.3. 속성 전달받을 수 있게 하기
//Square 컴포넌트에서 수정, 속성 전달 받도록
var squareStyle = {
    height: 150,
    backgroundColor: this.props.color //속성 전달받음
};
//Label 컴포넌트에서 수정,속성 전달 받도록
return( 
    <p style={labelStyle}>{this.props.color}</p> //속성 전달받음
);
//Card 컴포넌트에서 수정, 속성을 전달하도록(to. Square, Label)
return(
    <div style={cardStyle}>
        <Square color={this.props.color}/> {/* 속성전달 해 줌 */}
        <Label color={this.props.color}/> { /* 속성전달 해 줌 */}
    </div>
);
// ReactDom에서 색성 지정하도록 수정
<div>
    <Card color="#FFA737"/> {/* 속성 지정 */}
</div>,

 
				