JSX는 자바스크립트와 HTML을 동시에 사용하며, HTML에 자바스크립트의 변수를 바로 사용할 수 있는 일종의 템플릿 언어(Template language)로, 리액트로 개발할 때 사용하므로 공식적인 자바스크립트 문법은 아니다.
이런 형식으로 작성한 코드는 브라우저에서 실행되기 전에 코드가 번들링되는 과정에서 바벨을 사용하여 일반 자바스크립트 형태의 코드로 변환된다.
function App(){
return (
<div>
Hello <b>react</b>
</div>
);
}
위의 코드는 아래와 같이 변환된다.
function App(){
return React.createElement("div", null, "Hello", React.createElement("b", null "react"));
}
컴포넌트에 여러 요소가 있다면 반드시 부모 요소 하나로 감싸야 한다.
// 잘못된 코드
function App(){
return(
<h1>Hello</h1>
<h2>Is it working well?</h2>
)
}
// 올바른 코드
function App(){
return(
<div>
<h1>Hello</h1>
<h2>Is it working well?</h2>
</div>
)
}
하나의 요소로 감싸줘야하는 이유?
Virtual DOM에서 컴포넌트 변화를 감지해 낼 때 효율적으로 비교할 수 있도록 컴포넌트 내부는 하나의 DOM트리 구조로 이루어져야 한다는 규칙이 있다.
// 자바스크립트 표현
function App(){
const name = 'react';
return(
<>
<h1>Hello! {name}</h1>
<h2>Is it working well?</h2>
<>
)
}
JSX 내부의 자바스크립트 표현식에서 if문을 사용할 수는 없다. 하지만 조건에 따라 다른 내용을 렌더링해야 할 때는 JSX 밖에서 if문을 사용하여 사전에 값을 설정하거나, { } 안에 조건부 연산자를 사용하면 된다. 조건부 연산자는 삼항 연산자이다.
// 자바스크립트 표현
function App(){
const name = 'react';
return(
<div>
{name === 'react'? (<h1>This is react</h1>) : (<h2>This isn't react</h2>)}
</div>
)
}
export default App;
개발하다 보면 특정 조건을 만족할 때 내용을 보여 주고, 만족하지 않을 때 아예 아무것도 렌더링 하지 않아야 하는 상황이 올 수 있다. 조건부 연산자(삼항 연산자)로도 구현할 수 있지만 AND 연산자를 사용하면 더 짧은 코드로 똑같은 작업을 할 수 있다.
// AND 연산자
function App(){
const name = 'rreact';
return(
<div>
{name === 'react' && <h1>It's correct</h1>}
</div>
)
}
&& 연산자로 조건부 렌더링을 할 수 있는 이유는 리액트에서 false를 렌더링할 때는 null과 마찬가지로 아무것도 나타나지 않기 때문이다. 여기서 한 가지 주의해야 할 점은 falsy한 값인 0은 예외적으로 화면에 나타난다는 점이다.
const number = 0;
return number && <div>내용</div>
위 코드는 화면에 '내용'을 보여주는 것이 아니라 숫자 0을 보여 준다.
리액트 컴포넌트에서는 함수에서 undefined만 반환하여 렌더링하는 상황을 만들면 안 된다. 예를 들어 다음과 같은 코드는 오류를 발생시킨다.
import './App.css';
// undefined를 렌더링 하지 않기
function App(){
const name = 'undefined';
return name;
}
코드를 저장한 후 브라우저를 확인해 보면 다음과 같은 오류를 볼 수 있다.
App(...): Nothing was returned from render. This usually means a return statement is missing.
Or, to render nothing, return null
어떤 값이 undefined일 수도 있다면, OR(||)연산자를 사용하면 해당 값이 undefined일 때 사용할 값을 지정할 수 있으므로 간단하게 오류를 방지할 수 있다.
import React from 'react';
import './App.css';
function App(){
const name = 'undefined';
return name || '값이 undefined입니다.';
}
export default App;
반면 JSX 내부에서 undefined를 렌더링하는 것은 괜찮다.
import React from 'react';
import './App.css';
function App(){
const name = 'undefined';
return <div>{name}</div>
}
export default App;
name 값이 undefined일 때 보여 주고 싶은 문구가 있다면 다음과 같이 코드를 작성할 수 있다.
import React from 'react';
import './App.css';
function App(){
const name = 'undefined';
return <div>{name || 'react'}</div>;
}
export default App;
- JSX 스타일링
JSX에서 JavaScript 문법을 쓰려면 {}를 사용해야 하기 때문에 스타일을 적용할 때에서 객체 형태로 넣어주어야 한다.
camelCase로 작성해주어야 한다.(font-size -> fontSize)
function App() {
const style = {
backgroundColor: 'black',
fontSize: '10px'
}
return (
<div style={style}>Hello, YoonHu</div>
);
}
class 대신 clssName
일반 HTML에서 CSS 클래스를 사용할 때에는 class라는 속성을 사용한다.
JSX에서 class가 아닌 className을 사용한다.
function App() {
const style = {
backgroundColor: 'green',
fontSize: '12px'
}
return (
<div className="testClass">Hello, GodDaeHee!</div>
);
}
도서 리액트를 다루는 기술
[React 기초] JSX란? / JSX 문법
[기술면접] JSX