01. JSX를 활용한 본격적인 React

Gardener·2024년 1월 6일
0

ReactStudy

목록 보기
2/7

결과를 먼저 말해보자면, React는 뭐랄까 조금 더 Component적이다. 사실 Vue를 먼저 배웠는데, Vue는 뭐랄까 구조적이였다. 흠 Component나 구조나 비슷비슷한 말일까?

Code의 비교를 통해, 알아보자. 저번 시리즈에서는 JavaScript 기반의 간단한 페이지를 구성하는 것을 목표로 했었다.

<!DOCTYPE html>
<html>
<body>
    <span> Counter : 0</span>
    <button id="btn"> click me </button>
</body>
<script>
    let counter = 0;
    const button = document.getElementById("btn");
    const span = document.querySelector("span");
    function handleClick() {
        counter++;
        span.innerText = `Counter : ${counter}`;
    }
    button.addEventListener("click", handleClick);
</script>
</html>

투박하지만 고전적인 react의 방식으로 아래와 같이 변환할 수 있다.

<!DOCTYPE html>
<html>
<body>
    <div id="root"></div>
</body>
<script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
<script>
    const root = document.getElementById("root");
    const h3 = React.createElement("h3", 
    {
        id:"title",
        onMouseEnter: () => console.log("mouse enter"),
    }, 
    "Hello, I`m span" );
    const btn = React.createElement(
        "button",
    {
        onClick: () => console.log('im clicked'),
        style: {backgroundColor : "tomato"},
    },
    "Click me"
    );
    const container = React.createElement("div", null, [h3,btn]);
    ReactDOM.render(container, root);
</script>
</html>

차이점으로 src를 활용하여 cdn을 활용하였고, 뭐랄까 뭔가뭔가 조금 더,, 쪼개졌다?? (생각해보면 나중에는 npm~ 어쩌고로 react를 설치할 것 이라고 예상한다. CDN도 옛날 방식 아닌가)

React.createElement() 를 활용했다.

React.createElement() 함수는 React Component를 생성한다.

이 함수의 첫 번째 인자는 태그 이름("h3", "button" 등), 두 번째 인자는 해당 태그의 속성 객체(예: { id: "title", onMouseEnter: ... }), 세 번째 인자는 자식 요소나 텍스트를 활용했다.

이후 여러 요소를 배열로 조합하여 하나의 Container에 요소들을 넣어버렸다! 이후 만들어진 요소들을 웹페이지 실제 DOM에 렌더링했다. 여기서는 container를 root div에 렌더링했다.

const container = React.createElement("div", null, [h3, btn]);
ReactDom.render(container, root)

하지만 이 방법은 React를 사용하는 개발자들 중 어느 누구도 사용하지 않는 어려운 방법이라고 한다. 이제는 실제적으로 JSX를 사용한다고 한다. JSX에 대해 간단히 알아보고 아래 예시로 비교를 확인해보자.

JSX
: JavaScript XML의 약자로, HTML과 유사한 구문을 사용하여 React 요소를 생성하는 JavaScript의 구문 확장이다.

JSX는 React의 createElement 함수 호출로 변환된다. 이는 브라우저에서 직접 해석할 수 없기 때문에, Babel과 같은 컴파일러를 사용하여 일반 JavaScript 코드로 변환해야한다. (강의를 똑같이 따라쳤는데 계속해서 Console창에서 에러가 났는데 바벨로 변환했어야했다..)

<!DOCTYPE html>
<html>
<body>
    <div id="root"></div>
</body>
<script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
<script type="text/babel">
    const root = document.getElementById("root");
    
    function Title() {
        return (
            <h3 id="title" onMouseEnter={() => console.log("mouse enter")}>
            Hello, I'm a title
            </h3>
        );
    }

    const Button = () => (
        <button 
        style={{
        backgroundColor:"tomato",
    }} 
    onClick={()=>console.log("im clicked")}> 
    Click me 
    </button>
    );

    const Container = () => <div>
        Component의 첫문자는 대문자로.
        <Title/>
        <Button/>
        </div>
    
    ReactDOM.render(<Container/>, root);
</script>
</html>

이전 예시에서는 React.createElement를 사용하여 요소를 생성했지만, 이 예시에서는 JSX를 사용한다. 함수형 컴포넌트를 사용하여 UI를 구성하는 방법을 나타낸다.
그렇다. 더 Component적으로 변했다. 또한 이곳에서는 화살표함수를 사용하여 각 Const 변수를 함수로 변환했다. Button Component에서는 화살표 함수를 , Title에서는 기존의 고전적인 함수와 return의 방식을 택했다.

여기까지가 강의의 2챕터, 다음 강의에서는 뭐가 어떻게 되려나, 시간이 별로 없는 것만 같다. 급박하게 이해해 나가야 한다.

profile
영혼의 정원수

0개의 댓글