jinux127 2022. 6. 10. 00:18

우리 빙먹 프로젝트에 사용할 리액트의 이름은 빙액트다.

빙액트를 구현하는 과정이 쉽지만은 않을 것이다. 하지만 쫄지말자. 쉽지않다는 것은 얻어 갈 것도 많다는 것!!! 아 설레네~~

 

 

먼저 리액트를 구현하기 전에 기본 개념을 알아야 한다. 먼저 JSX로 정의된 엘리먼트가 어떻게 JS로 변환되는지,이를 어떻게 React는 createElement 하는지에 대해 알아야 한다.

기본 개념

const element = <h1 title="foo">Hello</h1>

// JSX -> JS
const element = React.createElement(
  "h1",
  { title: "foo" },
  "Hello"
)
​

JSX는 바벨과 같은 빌드 툴에 의해 JS 코드로 변한해준다. 변환받은 JS 코드에서 React.createElement는 인자 값들로 객체를 생성하고 유효성 검사를 한다.

 

React.createElement 로 생성된 객체는 아래와 같다.

const element = {
  type: "h1",
  props: {
    title: "foo",
    children: "Hello",
  },
}

보면 알겠지만 type은 DOM 노드의 타입을 지정하는 문자열, tagName이다. 또 props에 여러 속성들을 객체형태로 가지고  이 중 children은 자식 노드들을 저장할 객체라고 보면 된다. 지금은 문자열이지만 일반적으론 배열의 형태이다.

 

const container = document.getElementById("root")
ReactDOM.render(element, container)

이제 render를 구체해보자

const node = document.createElement(element.type)
node["title"] = element.props.title

const text = document.createTextNode("")
text["nodeValue"] = element.props.children

node.appendChild(text)
container.appendChild(node)

1. DOM 노드이 타입에 맞게 노드 생성

2. props를 해당 노드에 설정해준다. 

3. children의 값인 Hello의 문자열을 넣어주기 위해 TextNode생성

4. 이 텍스트 노드에 nodeValue 속성에 해당 문자열 "Hello"를 설정해준다. 

5. 노드에 자식요소에 넣고 이를 컨테이너에 넣는다.

 

이렇게 리액트가 구현되는 간단한 로직이다.