[javascript] javascript boot camp 16기 열네번째 수업

2020-10-07

자바스크립트 부트캠프 16기 열네번째 수업

리액트 백그라운드

JSX 문법

codesendbox.io 이용해서 react 기본 디렉토리 구조 보기.
ko.reactjs.org 참고해서 react.js 베이스지식 알기
JSX 문법으로 진행함.

dom api 최소화해서 사용하기위해,
문자열 템플릿을 다뤄서 ui를 구성한다.

DOM 직접 컨트롤 방지하고, 업데이트를 최소화하고 오버헤드를 막기 위해 변한 데이터 부분만 업데이트해줘서 효율성과 성능을 챙김

자바스크립트로 virtual DOM 을 만들기 위해 리액트가 제공해주는 api React.createElement() 이다~ 근데 요거를 다른 형태로 제공한다.
기존의 html 마크업은 개발자들이 익숙하니깐, 마크업과 같은 형태로 제공하고자 만든게 JSX

JSX 템플릿을 리액트가 중간에 컨버팅해줘서 html로 산출해줌
모던웹: 최신 자바스크립트 스펙으로 구축을 한 후 브라우저에 따라서 맞는 스펙으로 보여주는 도구들이 있는 웹이라고 봐도되겠다..

Modules - Import & Export

모듈화

자바스크립트는 코드를 기능 따라 나누는 스펙이 다른 언어에 비해 약했다.
모듈이라는 개념이 애초에 없었음.
모듈은 함수보다 더 큰 단위라고 생각하면 됌.
코드를 기능 따라 파일 단위로 나누고 import, export 시키는 그룹화를 모듈화라고 함.
head태그 안의 src태그로 불러오면 안쓸때도 전역공간에 존재하기때문에, 필요할 때만 불러다가 쓰자.라는 개념이 import다

  // from 뒤에 경로가 현재 디렉토리라도 꼭 적어야함.

  import { add } from './utils'; 
  // 하나만 갖고올거야해도  브레이스 표기
  // 여러개 중에서 하나만 갖고올거야 할때는 브레이스 표기

  import { add, sum } from './utils';
  // 여러개 갖고올거야

  import { add as Add } from './utils';
  // alias 별명. add라는게 이미 import 시키는 파일에 존재하면 as 뒤에 별명 붙혀서 사용

  import Add from './utils';
  // 기본적으로 내보내는 함수 1개일 때. export 할 때는 export default 로 하고 브레이스 없이 바로 별명 붙혀서 import 시킴.

  import * as name from './utils';
  // 예를 들면 15개의 모듈이 name으로 내보내져서 methods사용하듯이 사용하면 됌. name.function 어쩌고~

  import name from 'react';
  // npm에서 다운로드 받으면 node_modules 폴더가 만들어지는데, 경로 지시자가 없을 경우 바로 node_modules 폴더에서 찾아옴.

다른 파일에서 불러다쓸 수 있는걸 명시적으로 표기하는 export다

react import 기본적인 모듈 2가지

  1. react
  2. react dom: 가상돔에 관여하는 리액트 모듈
import React from 'react';
import ReactDOM from 'react-dom';
// 1. reactDOM이 제공해주는 render함수를 이용해서 가상돔 만들기.
ReactDOM.render(React.createElement('h1', null, 'hello'), 
  document.querySelector('#root')
) // 버츄얼 돔 받기
// react가 이 virtal DOM을 real DOM으로 바꿀텐데..
// 근데 이렇게 쓰면 번거로움

// 2. 일반 html을 반환하는 function은, babel이 알아서 리액트에 맞는 돔으로 바꿔줌.
function Hello(){
  return <h1>Hello? 안녕하세요?</h1>;
}

// 3. 그래서 이런 식으로 가능하다~ 
ReactDOM.render(<Hello></Hello>, document.querySelector('#root')); 
  function App(){
    return (
      <div>
        <Title></Title>
        <Contents></Contents> 
        <br></br> 
      </div>
    )
    //리액트가 제공하는 html components는 대문자가 아니라 소문자로 작성한다. 사용자 컴퍼넌트는 대문자로 사용한다.

    // br단독태그라고 해도 닫히는 태그를 작성해줘야한다. 아니면 <br /> 이렇게라도 써야한다.
  }

리액트 컴퍼넌트의 전달인자 이름은 관례적으로 props. (object의 property)

function Title(props){
  return <h1>{props.title}</h1>;
}

// vue가  이렇게 감싼 것처럼 {} 이렇게 감쌈. 문자열이 아니라는걸 구분하기 위해서..

// style줄때 더블브레이스가 -> 문자열 말고 js 쓸꺼야. 그리고 전달해주는건 객체야 해서 

큰 이미지

title이라는 함수를 다시 호출한단건 당연히 0부터 시작하게 됌.

+1 한걸 react가 감지한다해도 virtual DOM을 다시 호출하면 (detect) 0으로.. 그래서 함수 안에서 상태를 가질 수가 없다.

그래서 class components라는걸 제공한다.

import React from "react";

// 상태값을 가져야할 때 형식
export default class ColorTitle extends React.Component {
  // react는 상태를 가지기 위해서 생성자를 만듬.
  const

  onChangeColor() {
    console.log("click h1");
  }

  // 이런 형식일 때 지켜야하는 약속. 규칙. render 함수
  render() {    
    const colors = this.props.color.split(",");
    const styles = {
      color: colors[0],
      fontSize: 20
    };

    return (
      <h1 style={styles} onClick={this.onChangeColor}>
        {this.props.title}
      </h1>
    );
  }
}

class components / 함수형 components
대부분의 components는 함수형 컴퍼넌트로 작성을 할 것임. 상태 바꾸는 리액트 훅 메소드 useState를 써서 구조분해할당으로 코드 간결하게 단축하고.. 그렇게 진행..