본문 바로가기

FrontEnd

[Next.js 튜토리얼] JS에서 리액트로

반응형
해당 문서 정리 
상당히 내용이 괜찮네요 https://beta.reactjs.org/

시작 : 

사용자가 웹 페이지를 방문하면 서버는 다음과 같은 HTML 파일을 브라우저에 반환합니다.

브라우저는 HTML을 읽고 DOM(문서 개체 모델)을 구성합니다.

DOM은 무엇인가요?

DOM은 HTML 요소의 객체 표현입니다.
코드와 사용자 인터페이스 사이의 다리 역할을 하며 부모와 자식 관계가 있는 트리 구조를 가지고 있습니다.

DOM 메서드와 JavaScript와 같은 프로그래밍 언어를 사용하여 사용자 이벤트를 수신하고 사용자 인터페이스에서 특정 요소를 선택, 추가, 업데이트 및 삭제하여 DOM을 조작할 수 있습니다.
DOM 조작을 사용하면 특정 요소를 대상으로 할 뿐만 아니라 스타일과 내용도 변경할 수 있습니다.

JS와 DOM 메소드로 UI 업데이트하기

우리는 아마추어가 아니니까 구구절절한 내용은 생략합니다.

<!-- index.html -->
<html>
  <body>
    <div id="app"></div>

    <script type="text/javascript">
      // Select the div element with 'app' id
      const app = document.getElementById('app');

      // Create a new H1 element
      const header = document.createElement('h1');

      // Create a new text node for the H1 element
      const headerContent = document.createTextNode(
        'Develop. Preview. Ship. 🚀',
      );

      // Append the text to the H1 element
      header.appendChild(headerContent);

      // Place the H1 element inside the div
      app.appendChild(header);
    </script>
  </body>
</html>

 

개발자 도구 내부의 DOM 요소를 보면 DOM에 <h1> 요소가 포함되어 있음을 알 수 있습니다. 페이지의 DOM은 소스 코드, 즉 사용자가 만든 원본 HTML 파일과 다릅니다.

HTML vs the DOM

HTML은 초기 페이지 콘텐츠를 나타내는 반면
DOM은 작성한 JavaScript 코드에 의해 변경된 업데이트된 페이지 콘텐츠를 나타냅니다.

명령적 vs 선언적 프로그래밍

 

dom api로 돔 조작은 방법(how)을 다루기에 상당히 verbose합니다.

내가 보여주고자 하는 것(what)을 묘사하고, 컴퓨터가 방법(how)를 다루게 합시다. 그래서 리액트를 사용합니다.

(요리사에게 피자를 만드는 방법을 알려주기 vs 피자를 주문하기 🍕)

 

"반죽을 짜고, 도우를 굴리고, 토마토 소스를 넣고, 치즈를 넣고, 햄을 넣고, 파인애플을 넣고, 200도 화덕에서 굽고..."
“하와이안 피자 주세요.”

 

리액트 시작하기

  • react는 React 코어 라이브러리입니다.
  • react-dom은 DOM과 함께 React를 사용할 수 있도록 하는 DOM 관련 메서드를 제공합니다.

JSX?

 

JSX는 친숙한 HTML과 유사한 구문으로 UI를 설명할 수 있는 JavaScript 구문 확장입니다.
JSX의 좋은 점은 다음 세 가지 JSX 규칙(the-rules-of-jsx)을 제외하고는 HTML 및 JavaScript 외부에서 새로운 기호나 구문을 배울 필요가 없다는 것입니다.
  1. 단일 루트 엘리먼트를 리턴
  2. 모든 태그는 닫아야 함
  3. 대부분의 속성을 카멜 케이스로 
    1. JSX는 js로 바뀌고 애트리뷰트는 JS 오브젝트의 키로 변경됨.
    2. JS는 class같은 예약어나 변수에 -를 포함하는 일을 할 수 없음
    3. 역사적 이유로 aria-* 및 data-* 속성은 HTML과 같이 대시를 사용하여 작성합니다.

jsx 컨버터를 사용해보기

브라우저는 JSX를 기본적으로 이해하지 못하므로 JSX 코드를 일반 JavaScript로 변환하려면 Babel과 같은 JavaScript 컴파일러가 필요합니다.

리액트의 렌더링은 컴포넌트를 호출하여, 커밋(실제로 변경된 부분만 돔 변경)하기위한 부분을 계산하기 위한 작업임.

렌더링 과정에서 DOM 위치가 변경되지 않은 요소들은 그대로 재사용함.

다른 분기에서 그려졌지만 같은 컴포넌트 취급

 

sandpack-project - CodeSandbox

sandpack-project using react, react-dom, react-scripts

codesandbox.io

즉, 중요한 것은 렌더링 결과 UI 트리에서의 위치임. 같은 위치에 동일하게 props 변경 없이 나타났다면 완전히 같은 것으로 취급함.

이게 상당한 버그를 만들 수 있음

컴포넌트와 UI 만들기

사용자 인터페이스는 컴포넌트라 하는 더 작은 빌딩 블록으로 나눌 수 있습니다.
컴포넌트를 사용하면 자체 포함된 재사용 가능한 코드 조각을 작성할 수 있습니다

이 모듈성은 애플리케이션의 나머지 부분을 건드리지 않고도 컴포넌트를 쉽게 추가, 업데이트 및 삭제할 수 있기 때문에 코드가 성장함에 따라 유지 관리가 더 쉬워집니다.
React 컴포넌트의 좋은 점은 단지 JavaScript라는 것입니다.
React 컴포넌트는 일반 HTML 및 JavaScript와 구분하기 위해 대문자로 표시해야 합니다.

컴포넌트 중첩도 가능!

렌더링을 위한 데이터인 Prop 전달하기

렌더링을 위해 필요한 데이터가 아니면 알 필요가 없습니다.

상태와 훅

훅을 사용하면 상태를 사용하는 추가 로직을 컴포넌트에 더할 수 있습니다.

상태 vs 프롭스

Props는 컴포넌트에 전달되는 읽기 전용 정보입니다.
State는 일반적으로 사용자 상호 작용에 의해 변경이 트리거되는, 시간이 지남에 따라 변경될 수 있는 정보입니다.

추가 참고자료

반응형