Web Front-end/React

[React/jsx/DOM/Basic] React의 DOM 조작과 JSX

SandBox환경에서 React를 살짝 맛보고, 후에 Visual Code를 이용해서 npm을 이용해보겠습니다.

 

DOM 조작

JS로 DOM을 조작하는건 당연한 일이다. JS는 "동적"으로 웹페이지를 만들기 위해서, 작성하는 스크립트니까. 

 

* DOM 이란? 

더보기

Document Object Model로, 브라우저에서 HTML 태그를 처리하기 위해서, 만든 "개념"이라고 보면 된다.

예를들어, 버튼 1개가 있으면 우리는 버튼이라고 인식하지만 , 브라우저에서는 버튼 태그를 지정하기 위해서 일종의 관리 체계가 필요하게 된다. 즉, 태그들과 같은 HTML 객체들을 관리하기 위한 체계가 DOM이다. DOM은 트리형태를 띄고 있다.

 
const rootEl = document.getElementById("#root");

const inner= document.createElement("h1");
inner.textContenet = "This is JS!";

rootEl.appendChild(inner);

React 또한, JS의 라이브러리 이기 때문에, 위와 같은 형태로 처음에는 DOM을 조작했다.화면에 Render하는 함수는 따로 있었지만,  Element를 생성하고넣는 형태는 JS와 별 다를게 없었다. 즉 , DOM 조작에 대한 개념은 똑같다. 

//element 
const element= React.createElement("h1",null,"This is React!");

//render
ReactDOM.createRoot(root).render(element);

See the Pen JS,React -1 by Doge (@DogeIsFree) on CodePen.

 

 

JSX의 등장

위 코드를 봐도 알겠지만, 기존의 DOM 조작을 조금만 변형했을 뿐, 크게 얻는 이점은 없다. 오히려, ReactDOM이라는 생소한 객체를 써야하고 , 익숙해진 Document 조작을 버리기에는 React는 불편했습니다. 그래서 , React는 JSX라는 문법을 지원하게 됩니다.

 

JS를 이용해서, 결국은 HTML을 만들어 내는거니까, HTML 문법을 JS로도 작성할 수 있게끔(?) 만든게 JSX입니다.

(JS와 HTML 사이의 그 무언가)

const element= React.createElement("h1",null,"This is React!");

//JSX 
const element = <h1>This is JSX</h1>

하지만, 세상에는 공짜는 없습니다. 위의 문법을 지원하기 위해서는 Babel이라는 친구의 도움이 필요합니다.

 

*Babel이란?

더보기

Babel은 ECMA(표준화)된 코드 이전 JavaScript 엔진에서 실행할 수 있게 해주는 JavaScript 트랜스 컴파일러 입니다.(즉, 최신화된 코드를 옛날 코드 방식으로 바꿔줌)

React의 JSX 문법도 JS 엔진이 알아들을 수 있게끔 바벨이 바꿔줍니다.

See the Pen JS,React2 by Doge (@DogeIsFree) on CodePen.

 

 

JSX를 지원하게 되면서, HTML에서, "변수"의 개념을 쓸 수 있게 되었습니다. className도 변수를 취급할 수 있게 되었고, 안에 들어가는 내용도 변수로 취급해서 바로 넣을 수 있게 되었습니다. 예전 JS처럼 각각의 DOM에 하나하나 넣어주는 방법보다 훨씬 간단해지게 됩니다.

 

DOM객체를 찍어내보자

1개의 Element를 간단하게 만들었습니다. 하지만, 우리는 수많은 Element들을 JS로 통제해 왔습니다. 이제는 , JSX를 이용해서 DOM 객체를 쉽게 찍어낼 수 있지 않을까는 생각을 하게됩니다. ( ㄷㄷ 제가 한건 아닙니다)

 

아래와 같은 간단한 HTML을 JSX로 작성해봅시다! 

<div id="container">
	<div class="1"></div>
    <div class="2"></div>
    <div class="3"></div>
</div>

React는 JS입니다. JS에서 createDocumentFragement()를 이용해서, 여러가지 tag들을 하나로 묶어서 처리한 기억이 있습니다. React 또한, ReactFragment라는 개념을 이용해서, 위와 같은 여러가지 Element를 하나로 묶어서 children으로 한꺼번에 넣어주는 형태로 구현하게 됩니다. 

<body>
  <div id="root"></div>
  <script type="text/babel">
    const element = 
          <React.Fragment 
            children={
            [
              React.createElement("h1",null,"나는 H1"),
              React.createElement("h3",null,"나는 H3"),
              React.createElement("h5",null,"나는 H5")
            ]
          }
    />
    ReactDOM.createRoot(root).render(element);
  </script>
</body>

React.createElement는 JSX문법으로 작성이 가능하게 됩니다. 즉, 아래와 같이 간단해집니다.

<body>
  <div id="root"></div>
  <script type="text/babel">
    const element = 
          <React.Fragment 
            children={
            [
             <h1>나는 H1</h1>,
             <h3>나는 H3</h3>,
             <h5>나는 H5</h5>,
            ]
          }
    />
    ReactDOM.createRoot(root).render(element);
  </script>
</body>

children을 inject (주입)하는 형태가 아니라, 태그안에 직접 넣는 방식으로 만든다면, 더 보기 좋은 문법이 될것 같습니다.

<script type="text/babel">
    const element = 
          <React.Fragment>
            <h1>나는 H1</h1>
            <h3>나는 H3</h3>
            <h5>나는 H5</h5>
           </React.Fragment>
    ReactDOM.createRoot(root).render(element);

See the Pen Untitled by Doge (@DogeIsFree) on CodePen.