개발여행의 블로그
[React 기초] JSX란? / JSX 문법 본문
JSX란?
JSX는 자바스크립트의 확장 문법이다. XML과 매우 비슷하게 생겼으며, 이런 형식으로 작성한 코드는 브라우저에서 실행되기 전에 코드가 번들링되는 과정에서 바벨을 사용하여 일반 자바스크립트 형태의 코드로 변환된다.
function App(){
return (
<div>
Hello <b>react</b>
</div>
);
}
위의 코드는 아래와 같이 변환된다.
function App(){
return React.createElement("div", null, "Hello", React.createElement("b", null "react"));
}
만약 컴포넌트를 렌더링 할 때 마다 위 코드처럼 매번 React.createElement 함수를 사용해야 한다면 매우 불편할 것이다. JSX를 사용하면 매우 편하게 UI를 렌더링할 수 있다.
JSX도 자바스크립트 문법인가?
JSX는 리액트로 개발할 때 사용되므로 공식적인 자바스크립트 문법이 아니다. 바벨에서는 여러 문법을 지원할 수 있도록 preset 및 plugin을 설정한다. 바벨을 통해 개발자들이 임의로 만든 문법, 혹은 차기 자바스크립트의 문법들을 사용할 수 있다.
JSX 문법 규칙
1. 감싸인 요소
컴포넌트에 여러 요소가 있다면 반드시 부모 요소 하나로 감싸야 한다.
import React from '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>
)
}
export default App;
//=====================================================
// div요소를 사용하고 싶지 않을 때 Fragment라는 기능 사용
// 코드 상단 import 구문에서 react 모듈에 들어있는 Fragment라는 컴포넌트를 추가로 불러오기
import React, {Fragment} from 'react';
function App(){
return(
<Fragment>
<h1>Hello</h1>
<h2>Is it working well?</h2>
<Fragment>
)
}
// Fragment는 다음과 같은 형태로도 표현할 수 있다.
function App(){
return(
<>
<h1>Hello</h1>
<h2>Is it working well?</h2>
<>
)
}
export default App;
하나의 요소로 감싸줘야하는 이유?
Virtual DOM에서 컴포넌트 변화를 감지해 낼 때 효율적으로 비교할 수 있도록 컴포넌트 내부는 하나의 DOM트리 구조로 이루어져야 한다는 규칙이 있다.
2.자바스크립트 표현
JSX가 내부에서 코드를 { } 로 감싸면 자바스크립트 표현식을 작성할 수 있다.
import React from 'react';
// 자바스크립트 표현
function App(){
const name = 'react';
return(
<>
<h1>Hello! {name}</h1>
<h2>Is it working well?</h2>
<>
)
}
export default App;
3. 조건부 연산자
JSX 내부의 자바스크립트 표현식에서 if문을 사용할 수는 없다. 하지만 조건에 따라 다른 내용을 렌더링해야 할 때는 JSX 밖에서 if문을 사용하여 사전에 값을 설정하거나, { } 안에 조건부 연산자를 사용하면 된다. 조건부 연산자는 삼항 연산자이다.
import React from 'react';
// 자바스크립트 표현
function App(){
const name = 'react';
return(
<div>
{name === 'react'? (<h1>This is react</h1>) : (<h2>This isn't react</h2>)}
</div>
)
}
export default App;
4. AND 연산자(&&)를 사용한 조건부 렌더링
개발하다 보면 특정 조건을 만족할 때 내용을 보여 주고, 만족하지 않을 때 아예 아무것도 렌더링 하지 않아야 하는 상황이 올 수 있다. 조건부 연산자(삼항 연산자)로도 구현할 수 있지만 AND 연산자를 사용하면 더 짧은 코드로 똑같은 작업을 할 수 있다.
import React from 'react';
// AND 연산자
function App(){
const name = 'rreact';
return(
<div>
{name === 'react' && <h1>It's correct</h1>}
</div>
)
}
export default App;
위 코드를 실행하면 브라우저에 아무것도 나타나지 않을 것인다.
&& 연산자로 조건부 렌더링을 할 수 있는 이유는 리액트에서 false를 렌더링할 때는 null과 마찬가지로 아무것도 나타나지 않기 때문이다. 여기서 한 가지 주의해야 할 점은 falsy한 값인 0은 예외적으로 화면에 나타난다는 점이다.
const number = 0;
return number && <div>내용</div>
위 코드는 화면에 '내용'을 보여주는 것이 아니라 숫자 0을 보여 준다.
5. undefined를 렌더링하지 않기
리액트 컴포넌트에서는 함수에서 undefined만 반환하여 렌더링하는 상황을 만들면 안 된다. 예를 들어 다음과 같은 코드는 오류를 발생시킨다.
import React from 'react';
import './App.css';
// undefined를 렌더링 하지 않기
function App(){
const name = 'undefined';
return name;
}
export default App;
코드를 저장한 후 브라우저를 확인해 보면 다음과 같은 오류를 볼 수 있다.
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;
이 글은 '리액트를 다루는 기술' 책을 보고 정리한 내용입니다. 자세한 내용은 책을 참고하시기 바랍니다.
'개발 > React' 카테고리의 다른 글
[React] React Hooks의 장단점 (0) | 2021.12.27 |
---|---|
[Redux] Redux 기본 개념 정리(action, reducer, store, dispatch...) (0) | 2021.12.12 |
[React] 리액트 hooks (0) | 2021.11.29 |
[React] 리액트에 대해 알아보자! (0) | 2021.11.29 |
[React] React Life Cycle 정리 (0) | 2021.11.29 |