본문 바로가기

React

React 시작하기 - 02 - jsx 개념과 리액트 엘리먼트

리액트를 사용할 때 jsx를 꼭 써야만 하는 것은 아니다.

React.createElement() 같은 함수로 대체할 수도 있다.

하지만 이는 매우 복잡하고 번거로운 작업이 된다.

대신 jsx 를 쓰면 훨씬 간편해진다.

그래서 보통 React와 jsx는 실과 바늘처럼 함께 쓴다.

jsx 개념은 무엇이고 React 엘리먼트와 어떤 관계일까.

 

 

<body>
    <div id="root1">
        
    </div> 


    <div id="root2">

    </div>


    <div id="root3">

    </div>

    <div id="root4">

    </div>


    <div id="root5">
        
    </div>

    <!-- react cdn -->
    <script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
    <!-- react dom cdn -->
    <script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
    <!-- babel cdn -->
    <script src="https://unpkg.com/babel-standalone@6/babel.min.js"></script>

    <!-- define type as a babel  -->
    <script type="text/babel">


        // jsx란? 
        // JSX(JavaScript XML)는 Javascript에 XML을 추가한 확장한 문법이다.
        // 타입스크립트처럼, 자바스크립트를 조금 변형한 언어라고 이해해도 된다.
        // 어떤 문법적인 요소를 조금 추가한다든가, 어딘가를 조금 바꾼 자바스크립트다.
        // 아예 새로운 언어라든가, 독립적인 언어라고 보기에는 좀 어렵다.
        // 자바스크립트이기는 한데 프레임워크 정도로 기능이 추가된 언어라고 할까.
        // 지금 아래처럼, 자바스크립트이기는 한데, <h1> 같은 xml 태그들을 쓸 수 있는 기능부터가 jsx다.
        // JavaScript + Xml => JSX
        ReactDOM.render(
                <h1>Hello, world!</h1>,
                document.getElementById('root1')
        );

        // jsx 안에 js 표현식
        // jsx에서는 중괄호 안에 JavaScript에서 사용할 수 있는 모든 표현식을 넣을 수 있다.
        function formatName(user) {
            return user.firstName + ' ' + user.lastName;
        }
        const user = { firstName: 'Tom',
                        lastName: 'Holland'}
        const greetings = "Hello";
        const ele =             
            <div>
                <h1> jsx - js표현식</h1>
                <h2> {greetings} React!!! </h2>
                <h2> {greetings + ' World!!!'}</h2>
                <h2> {user.firstName} Cruise </h2>
                <h2> {user.firstName + ' Hardy'} </h2>
                <h2> {formatName(user)} </h2>
            </div>;
        ReactDOM.render(
            ele,
            document.getElementById('root2')
        );

        // jsx로 속성 넣기
        // 중괄호를 사용하여 속성값에 JavaScript 표현식을 넣을 수도 있다.
        // JSX는 HTML보다는 JavaScript에 가깝기 때문에, React DOM은 속성 이름을 camelCase로 붙인다.
        const attrValue = "This is test Value";
        const attrHref = "?hello=world";
        ReactDOM.render(
            <div>
                <input type="button" value={attrValue}/>
                <a href={attrHref}>click here</a>
            </div>
            ,
            document.getElementById('root3')
        );

        // 단, 속성값에 JavaScript 표현식을 삽입할 때 중괄호 주변에 따옴표를 입력하지 않는다.
        // 따옴표 또는 중괄호 둘 중 하나만 사용하고, 한 속성값에 두 가지를 동시에 사용하면 안 된다.
        // ReactDOM.render(
        //         <div>
        //             <a href={attrHref + "&hey=here"} >it works</a>    
        //             <a href={attrHref} + '&hey=here'>it occurs error</a>    
        //         </div>
        //     ,
        //     document.getElementById('root3')
        // )


        // jsx 객체 변환
        // Babel은 JSX를 React.createElement() 호출로 컴파일한다.
        // 다음 ele1 과 ele2는 같은 내용이다.
        const ele1 = (
            <h1 className="greeting">
                Hello, world!
            </h1>
        );
        const ele2 = React.createElement(
            'h1',
            {className: 'greeting'},
            'Hello, world!'
        );

        // 위 ele2 는 아래 ele3과 같은 객체를 생성한다.
        const ele3 = {
            type: 'h1',
            props: {
                className: 'greeting',
                children: 'Hello, world!'
            }
        };
        // 이러한 객체를 리액트 객체, 리액트 엘리먼트라고 한다.
        ReactDOM.render(
            ele2,
            document.getElementById('root4')
        )

        const ele4 = React.createElement(
            'h1',
            {className:'hello'},
            'world'
        )
        ReactDOM.render(ele4, document.getElementById('root5'));

    </script>

</body>

- 220523

참고자료 - 

https://ko.reactjs.org/docs/introducing-jsx.html

반응형