#TIL_21.10.07

ISOJ·2021년 10월 7일
1

Today I Learned

목록 보기
29/43
post-thumbnail

React (1)

React 소개

  • 상태변화를 감지하는 반응형 라이브러리
    반응형으로 상태를 관찰하고 변화가 발생하면 변화와 연관된 곳에서 연산을 수행한다.
  • MVC (Model View Controller) 에서 리액트는 View 에만 관여함
    컴포넌트 시스템으로 view 를 관리한다.
  • 컴포넌트: 재사용이 가능한 독립적인 객체
    여러 요소를 담을 수 있음 (HTML, Style, JS, Event, State, ...)
    트리구조로 컴포넌트끼리 서로 데이터를 주고받을 수 있음
    조합이 가능함 ... 여러개의 컴포넌트로 어플리케이션을 구성함.
  • Virtual DOM
    가상 돔: 코드로 돔 트리를 표현한 것이라 볼 수 있음 ... 필요한 부분만 한 번에 렌더링 (별다른 최적화 없이 빠른 성능을 낼 수 있다. / 가상돔은 성능보다는 개발을 편하게 최적화되어 있음)

create-react-app, JSX

create-react-app

  • 리액트로 어플리케이션을 만들 수 있는 가장 빠른 방법
  • webpack 등을 통한 build 설정을 직접 하지 않아도 됨
    npx create-react-app 만들 프로젝트 이름

JSX

  • JavaScript를 확장한 문법 / 가상돔을 정의 ... JS 파일이지만 HTML 문법처럼 보임
  • createElement 등을 통해 컴포넌트를 구성하는 방식을 쉽게 만들어줌
  • 반드시 최상위 요소가 하나여야 함 (최상위를 <div> / <> </>(프래그먼트) 로 묶는다.)
    프래그먼트 ... 최상위를 의미없는 div 로 묶기 싫을 때
  • 표현식, 조건문, 반복문의 사용이 가능
    • 표현식: const name = '이름' ... Hi {name}
    • 조건문: bool 등을 통해 true 일 때만 동작하는 등의 조작이 가능함 (삼항 연산자 사용 가능)
      const showLink = false .... {showLink && { JSX }} ... showLink 가 true 일 때만 && 뒤가 렌더링 됨
    • 반복문: 반복문 사용시, key를 반드시 넣어주여야 함
      const nums = [1, 2, 3] ... { nums.map(item => { <li key={item}>{item}</li> })}

컴포넌트

  • 컴포넌트는 상태와 이벤트를 담을 수 있다.
    컴포넌트는 트리구조로 이루어져 있어 서로 메시지, 데이터를 주고받을 수 있다.
    데이터는 상위 컴포넌트에서 하위 컴포넌트로만 흐름 ... 단방향
  • 리액트 컴포넌트는 HTML, 스타일, 로직 등을 담을 수 있다.
  • 여러 컴포넌트가 모여 하나의 어플리케이션을 만듦
  • 컴포넌트의 재사용성을 활용하는 방법
    UI 를 추상적으로 바라보기 (공통점을 찾는 것이 재사용의 시작)
    데이터를 JSX 로 받는다면 확장성 있게 사용이 가능함
  • 도메인으로 분류하기
    회원과 관련된 도메인 컴포넌트
    프레젠테이션과 관련된 도메인 컴포넌트 등...
  • 역할로 분류하기
    헤더 컴포넌트
    네비게이션 컴포넌트
    프레젠테이션 리스트 컴포넌트
    태그 컴포넌트 등...
  • props 를 통해 컴포넌트 간 데이터를 전달할 수 있으며, 데이터가 전달되지 않을 때의 기본값을 .defaultProps 로 정의해줄 수 있다.
    비구조화 할당을 통해서 전달받은 데이터를 사용할 수 있다.
  • props 의 type 를 정의해주기 위해서는 import PropTypes from 'prop-types' 를 통한 .propTypes 로 가능하다
    PropTypes.node.isRequired ... node: jsx 엘리먼트를 받을 수 있는 타입

상태와 이벤트 바인딩

hook

  • useState 와 같은 훅을 이용하여 (지역) 상태를 관리할 수 있다.
  • 이벤트 바인딩 ... 실행될 함수를 선언해주고 하위 컴포넌트에서 실행할 수 있다.

useEffect

  • 변화가 있을 때 감지하여 반응하는 훅
    useEffect(() => { // 이벤트 }, [감지할 데이터])
  • 라이프 사이클처럼 활용할 수도 있다 ... 감지할 데이터 배열에 값을 넣지 않으면 컴포넌트가 처음 로드될 때 한번 실행된다.
    위의 방식으로 전역적으로 이벤트를 잡는 용도로도 사용 가능하다(scroll handle 등) ... 전역 이벤트를 설정하였으면 반드시 해제해줘야 함 (return () => document.removeEventListener)
    useEffect 에서의 return 은 컴포넌트가 제거될 때 사용

useRef

  • 돔에 직접 접근하고자 할 때 사용하거나, 지역 변수로 사용할 때 사용한다.
  • 지역 변수로 사용할 때의 useState 와의 차이점
    useState 는 값이 변경될 때 다시 렌더링을 함
    useRef 는 값이 변경되더라도 다시 렌더링을 하지 않음
  • 돔에 직접 접근하고자 할때는 .current 를 통해 직접 접근할 수 있다.
  • 컴포넌트를 통한 돔의 접근도 가능하다.
    접근해야 할 하위 컴포넌트에서 React.forWardRef((props, ref) => {...}) 를 통해 접근할 수 있다.

회고

react 를 처음 배워보는 시간이 되었다. Vue 를 통한 기본 개념을 배워놓은게 많은 도움이 되었던 것 같다.
컴포넌트를 어디까지 쪼개야할까 라는 생각을 정말 많이 했는데, 너무 깊게 생각하지 말라는 조언이 많이 와닿았던 것 같다.

profile
프론트엔드

0개의 댓글