개발여행의 블로그

[React 기초] JSX란? / JSX 문법 본문

개발/React

[React 기초] JSX란? / JSX 문법

개발 여행 2021. 8. 6. 16:04
728x90

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;

 

 

 

 

 

이 글은 '리액트를 다루는 기술' 책을 보고 정리한 내용입니다. 자세한 내용은 책을 참고하시기 바랍니다.

728x90
Comments