(예시 코드 일부에서는 import, export 구문을 생략했음.)
JSX는 자바스크립트의 확장 문법으로, XML과 비슷하게 생겼다. JSX 코드는 브라우저에서 실행되기 전에 바벨을 사용하여 아래와 같이 일반 자바스크립트 형태로 변환된다.
// JSX
function App() {
return (
<div>
Hello <b>react</b>
</div>
);
}
// 위 JSX 코드가 JavaScript로 변환되었을 때의 모습
function App() {
return React.createElement("div", null, "Hello ", React.createElement("b", null, "react"));
}
바벨?
바벨(Babel)은 최신 자바스크립트 문법을 다른 환경에서의 호환성을 위해 이전 버전의 문법으로 재작성해주는 오픈소스 자바스크립트 컴파일러이다.
컴포넌트에 여러 요소가 있다면 반드시 부모 요소 하나로 감싸야 한다.
function App() {
return (
<div>
<h1>리액트</h1>
<h1>JSX</h1>
</div>
)
}
이렇게 하나의 요소로 감싸주는 이유는 컴포넌트 내부가 하나의 DOM 트리 구조로 이루어져야 한다는 규칙이 있기 때문이다. 이러한 규칙은 Virtual DOM에서 컴포넌트 변화를 감지할 때 효율적인 비교가 가능하도록 하기 위함이다.
div 요소를 사용하고 싶지 않다면 Fragment 라는 컴포넌트로 감싸줄 수 있다.(리액트 v16 이상부터) Fragment를 사용하기 위해서는 import 구문에서 react 모듈에 들어있는 Fragment 컴포넌트를 추가로 호출하면 된다.
import React, { Fragment } from 'react';
function App() {
<Fragment>
<h1>리액트</h1>
<h1>JSX</h1>
</Fragment>
}
Fragment는 아래와 같이 표현할 수도 있다.
import React from 'react';
function App() {
<>
<h1>리액트</h1>
<h1>JSX</h1>
</>
}
JSX 안에서 자바스크립트 표현식을 작성하려면 코드를 { } 로 감싸면 된다.
function App() {
const book = "그리고 아무도 없었다"
return (
<>
<h1>어제 읽은 책은 {book}입니다.</h1>
<h2>재미있었습니다.</h2>
</>
)
}
JSX에서는 if-else문을 사용할 수 없기 때문에 { } 안에 삼항 연산자를 이용하면 된다.
또한 특정 조건을 만족할 때만 내용을 보여주고, 만족하지 않으면 렌더링하지 않는 경우에는 AND 연산자(&&)를 사용하여 삼항연산자보다 더 간단히 표현할 수 있다.
function App() {
const country = '미국';
return <div>{country === '한국' && <h1>한국인입니다.</h1>}</div>;
}
리액트 컴포넌트에서는 함수에서 undefined만 반환하여 렌더링할 경우 에러가 발생한다. 따라서 어떤 값이 undefined일 수 있다면, OR 연산자(||)를 사용하여 값이 undefined일 때 사용할 값을 지정하여 에러를 방지할 수 있다.
function App() {
const name = undefined;
return name || '값이 없습니다.';
}
반면, 아래 코드와 같이 JSX에서는 undefined 렌더링이 가능하다.
function App() {
const name = undefined;
return <div>{name}</div>;
}
JSX 내부에서 스타일을 설정할 때는 String 형식이 아닌 key가 카멜 표기법으로 작성된 객체 형태로 넣어주어야 한다.
ex) background-color -> backgroundColor
일반 HTML에서는
이런 식으로 class를 설정했지만, JSX에서는 이렇게 class 가 아닌 className 이라고 작성해야 한다.HTML에서는 <input>
이라고만 작성해도 문제없었지만 JSX에서는 <input></input>
이런 식으로 반드시 태그를 닫아주어야 한다. 그러나 태그 사이에 별도의 내용이 들어가지 않을 경우에는 <input />
이런 식으로 self-closing 해주어도 된다.
JSX 내부에서의 주석은 {/* */} 와 같은 형식으로 작성한다.