트랜스파일(브라우저나 서버가 코드를 해석할 수 있도록 Javascript로 변환) 을 거치면 XML은 리액트 라이브러리에 대한 함수 호출로 변환됩니다.

<h1> Hello World</h1> 와 같은 코드는 React.createElement("h1", null, "Hello World"); 로 변환됩니다.

태그 특성은 낙타 표기법 으로 작성한다.

예를 들어, HTML에서 input 태그의 maxlength를 사용하고 싶다면, 다음과 같이 JSX에서는 대문자(“L”)로 작성해야 합니다.

// HTML
<input type="text" maxlength="30" />

// JSX
return <input type="text" maxLength="30" />

모든 요소는 짝이 맞아야 한다.

JSX는 XML이므로 모든 요소의 짝이 맞아야 합니다. <br> 및 <img> 같이 종료 태그가 없는 태그는 <br/>, <img src=”…”/> 처럼 작성해야 합니다.

단일 루트 노드

리액트 컴포넌트는 단일 루트 노드만 렌더링할 수 있습니다. 따라서 다음과 같은 코드는 유호하지 않습니다.

return (
    <h1>Hello World</h1>
    <h2>Have a nice day</h2>
)

정확히 말하면 이것은 JSX의 제한이 아니라 자바스크립트의 특징입니다. return문은 단일 값만 반환할 수 있지만, 이 코드는 두 개의 문을 반환려하고 합니다(React.createElement를 두 번 호출). 이는 다음과 같이 반환 값을 루트 객체 하나에 래핑해서 해결할 수 있습니다.

return (
    <div>
        <h1>Hello World</h1>
        <h2>Have a nice day</h2>
    </div>
)

// 트랜스파일 결과
return React.createElement("div", null,
    React.createElement("h1", null, "Hello World"),
    React.createElement("h2", null, "Have a nice day")
)

조건 절

if문은 JSX와는 잘 어울리지 않지만 이는 JSX의 제한이 아니라 JSX가 사실은 일반 자바스크립트이기 때문입니다.

다음과 같은 JSX가 있다고 가정해봅시다.

return (
    <div className="salutation">Hello JSX</div>
)

이 코드는 다음과 같이 정상적인 자바스크립트 코드로 변환된다.

return (
    React.createElement("div", {className: "salutation"}, "Hello JSX");
)

그런데 다음과 같이 JSX 중간에 if절을 넣었다고 가정해봅시다.

<div className={if (condition) { "salutation" }}>Hello JSX</div>

이 코드는 다음과 같이 잘못된 자바스크립트 식으로 변환됩니다.

React.createElement("div", {className: if(condition) { "salutation"}}, "Hello JSX");

이를 해결하기 위해 조건을 밖으로 이동하는 방법이 있습니다.

render() {
    let className;
    if (condition) {
        className = "salutation";
    }
    return (
        <div className={className}>Hello JSX</div>
    )
}

리액트는 정의되지 않은 값을 처리하는 방법을 이해하며, 조건이 false일 경우 div 태그 안에 클래스 특성을 생성하지 않습니다.