[React] 나만의 리액트 만들기 - 2 - 컴포넌트

2022. 9. 30. 12:53·React/실험실
반응형

Components와 Props 

이제 Components에 대해서 설명을 시작한다. 

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

제일 먼저 컴포넌트의 이해를 돕기 위해서 다음과 같은 함수가 나왔다. 

데이터를 가진 Props 객체를 받아서 React 엘리먼트를 반환하는 React 컴포넌트이다. 

 

함수 형태로 만들어져있기 때문에 " 함수 컴포넌트 "라고 불린다. 

 

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

const root = ReactDOM.createRoot(document.getElementById('root'));
const element = <Welcome name="Sara" />;
root.render(element);

컴포넌트를 사용해서 화면에 렌더링이 가능하다. 

여기까지는 우리가 만든 Crazy React도 어떻게든 가능하다. 하지만 중첩이 된다면 어떨까? 

 

function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

function App() {
  return (
    <div>
      <Welcome name="Sara" />
      <Welcome name="Cahal" />
      <Welcome name="Edite" />
    </div>
  );
}

이게 우리가 원하는 최종 형태의 React이다. 

하지만 우리는 JSX가 아니기 때문에 함수 컴포넌트를 태그로 만들 수 없다. 

 

오늘은 이론부분을 짧게 가자.

어떻게하면 우리가 만든 함수형 컴포넌트를 중첩해서 사용하게 할 수 있을까? 

function Element() {
  const test = () => {};

  return `<div>
            <span onClick2={test} onClick='{() => test()}'>test2</span>
            <span>test<span>
          </div>
        `;
}

function App() {
  return `
      <div>
        <Element />
        <Element />
        <Element />
      </div>
    `;
}

export default App;

이게 우리가 원하는 형식인데 일단 태그 형식으로 만드는 것은 불가능할 것 같다. 

JSX가 아니기 때문에 태그를 인식하기에는 불가능 하다. 그럼 어떤 방법이 있을까?

 

let domParser = new DOMParser();

const CrazyReactDOM = (function () {
  let rootDom;

  return {
    createRoot(targetNode) {
      rootDom = targetNode;

      return this;
    },

    render(node) {
      rootDom.innerHTML = node.render();
    },

    createNode(Component) {
      return {
        //
        element: null,
        render: function (props) {
          const rowElement = Component(props);
          const elementChildren = domParser
            .parseFromString(rowElement, "text/html")
            .querySelector("body").children;

          if (elementChildren.length !== 1) return;

          this.element = elementChildren[0];

          return this.element.outerHTML;
        },
      };
    },
  };
})();

export default CrazyReactDOM;

CrazyReactDOM을 조금 변경 시켜봤다. 

 

createNode라는 함수를 만들어서 내부에서 element를 관리하는 형식으로 만들었다. 

추후 이벤트를 준다던지 할 경우 element를 직접 컨트롤할 수 있어야하는데,

그럼 객체를 return 하는 방법말고는 당장 생각나는 형식이 없다. 

 

당연히 현재 만든 함수가 최종까지 남아있을지는 미지수이다. 

하지만 React에 맞는 형식으로 변경을 시켜가면 언젠간 모든 기능을 만들 수 있지 않을까 생각이든다.

 

조금씩 천천히 모든 기능을 추가해보자

 

참고

https://ko.reactjs.org/docs/components-and-props.html

 

Components와 Props – React

A JavaScript library for building user interfaces

ko.reactjs.org

 

깃허브

https://github.com/SeoJaeWan/Crazy-React/pull/2

 

feature: 컴포넌트 구현 by SeoJaeWan · Pull Request #2 · SeoJaeWan/Crazy-React

2일차 - 22/09/28 어떻게하면 함수형 컴포넌트의 방식으로 각 컴포넌트를 부모 컴포넌트에 렌더링 시킬지 고민하다가 구현을 하였다. 어제의 함수 부분과 마찬가지로 현재 구현 상태로 과연 리렌

github.com

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'React > 실험실' 카테고리의 다른 글

[React] 뒤로가기 버튼 감지  (1) 2022.10.11
[React] Webpack과 Babel과 TypeScript와 React  (1) 2022.10.03
[React] 나만의 리액트 만들기 - 1 - JSX 그리고 ReactDOM  (1) 2022.09.29
[React] Redux - toolkit 사용해보기 - todo  (1) 2022.07.23
[React] 실시간 채팅 만들기  (2) 2022.06.25
'React/실험실' 카테고리의 다른 글
  • [React] 뒤로가기 버튼 감지
  • [React] Webpack과 Babel과 TypeScript와 React
  • [React] 나만의 리액트 만들기 - 1 - JSX 그리고 ReactDOM
  • [React] Redux - toolkit 사용해보기 - todo
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    redux
    덤프
    네이버 부스트캠프
    타입스크립트
    바질 키우기
    typescript
    Babel
    CSS
    webpack
    javascript
    네트워크
    리얼클래스
    react
    프로그래머스
    Docker
    next.js
    바질
    Node.js
    자바스크립트
    타일러영어
    CCNA
    식물
    영어독학
    리액트
    ReactNative
    영어회화
    알고리즘
    리얼학습일기
    ChatGPT
    다이소
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React] 나만의 리액트 만들기 - 2 - 컴포넌트
상단으로

티스토리툴바