JS/React

[React] #6 리액트에서 Element 생성하기 : createElement()

emayom 2021. 8. 28. 01:26

오늘은 강의를 들으며 공부했던 내용을 작게나마 정리하려고 한다.

 

만약 리액트로 아래와 같이 텅텅 빈 html 내부에

<h1> 태그를 이용해 "Hello world"를 출력하고 싶다면 어떻게 할 수 있을까? 🤔

 

<!DOCTYPE html>
<html lang="en">
  <body>
  	<div id="root"></div>
  </body>
</html>

 

먼저 자바스크립트로 DOM을 다루며 Element를 생성할 때를 생각해보자.

우리는 아마도 아래와 같은 스크립트를 작성할 것이다. 

 

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

//삽입할 h1 엘리먼트를 생성
const h1 = document.createElement("h1");

//생성된 엘리먼트에 주입될 텍스트 작성
h1.textContent = "Hello world";

//해당 엘리먼트를 자식으로 추가
root.appendChild(h1);

 

그렇다면 리액트는 어떻게 작성할까?

같은 html 파일에서 리액트 코드를 작성하기 위해 CDN 코드를 추가해줬다.

 

 

+)

CDN이란,

Content Delivery Network의 약자로

웹에서 사용되는 다양한 리소스를 저장하여 제공하는 시스템을 의미하는데

지금 우리는 body 내부에 코드를 작성해두면 unpkg => unpack 네트워크를 사용하여

html 문서에서 리액트 코드를 실행이 가능하도록 도와준다.

자세한 링크는 아래에 리액트 공식문서를 링크해두었다!

 

<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>

 

 

본론으로 돌아와서

리액트에서도 createElement로 엘리먼트를 만들 수 있다.

하지만 차이점이 있다. 코드로 알아보자.

 

//JS
const h1 = document.createElement("h1");
h1.textContent = "Hello world";

//React
const h1 = React.createElement("h1", { children: "Hello world" });

 

자바스크립트는 Document.createElement()를 통해 엘리먼트 생성하고

Node.textContent()를 통해 텍스트 작성하며 이루어진 반면,

 

리액트는 createElement() 를 통해 작성한 방식을 확인할 수 있다.

 

 

 

그렇다면 appendChild는 ?

 

//JS
root.appendChild("h1");

//React
ReactDOM.render(h1, root);

 

자바스크립트가 Node.appendChild()를 통해 

괄호 안의 노드를 특정 부모 노드의 자식 노드 리스트 중 마지막 자식으로 붙인다고 하면,

 

리액트는 render()를 사용하여

첫 번째 요소(element)를 두 번째 요소(container)의 DOM에 렌더링 하고,

컴포넌트에 대한 참조를 반환한다. (?)

 

 

하지만 리액트에게는 html도 아닌 js도 아닌,, JSX라는 문법이 있다.

바벨을 사용하여 JSX 문법으로도 엘리먼트를 생성해보자.

 

우선 html 내부에서 사용하기 위해서는 스크립트 한 줄을 추가해줘야 한다!

이제 바벨을 통해 우리가 작성하는 코드를 자바스크립트 코드로 변환해줄 것이다.

<script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

 

그리고 script type="text/babel"으로 꼭 명시해줘야 작동한다.

 

const h1 = React.createElement("h1", { children: "Hello world" });

//JSX
const h1 = <h1>Hello world!!</h1>;

 

 

이렇게 리액트로 엘리먼트를 생성하고 추가하는 두가지 방법을 확인해보았다!!!!!

 

실제로 console.log로

자바스크립트를 통해 생성된 엘리먼트와

리액트를 통해 생성된 엘리먼트를 찍어보면 아래와 같은 결과를 확인해볼 수 있다.

 

console.log(h1) 

//자바스크립트
<h1></h1>

//리액트
{type: "h1", key: null, ref: null, props: Object, _owner: null…}

 

 

+)

역시 ,, 토스 프론트엔드 개발자는 설명도 잘하는 것일까,,?

설명을 너무 잘해주셔서 강의를 들으니 이해가 쉽게 잘된다,,,,😢

 

 


 

CDN 링크 – React

A JavaScript library for building user interfaces

ko.reactjs.org

 

Node.appendChild() - Web API | MDN

Node.appendChild() 메소드는 한 노드를 특정 부모 노드의 자식 노드 리스트 중 마지막 자식으로 붙입니다. 만약 주어진 노드가 이미 문서에 존재하는 노드를 참조하고 있다면 appendChild() 메소드는

developer.mozilla.org

 

ReactDOM – React

A JavaScript library for building user interfaces

ko.reactjs.org

 

⚠️ 아래 내용은 모두 개인적인 참고 / 기록을 위한 용도입니다. 참고해주시고 편안하게 봐주세요 :)  ⚠️
***    혹시라도 잘못된 정보가 있다면  언제든지 알려주시면 감사하겠습니다  !    ***