[개념] React에서 사용하는 JSX

posinity·2023년 3월 10일
0

React

목록 보기
35/58

JSX란?

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"));
}

문법 규칙

1. 반드시 부모 요소 하나로 감싸야 한다

컴포넌트에 여러 요소가 있다면 반드시 부모 요소 하나로 감싸야 한다.

// 잘못된 코드
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트리 구조로 이루어져야 한다는 규칙이 있다.

2. 내부에서 코드를 { } 로 감싸면 자바스크립트 표현식을 작성할 수 있다.

// 자바스크립트 표현
function App(){
	const name = 'react';
	return(
    	<>
          <h1>Hello! {name}</h1>
          <h2>Is it working well?</h2>
        <>
    )
}

3. if 대신 삼항 연산자(조건부 연산자)를 사용할 수 있다.

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;

4. AND 연산자(&&)를 사용한 조건부 렌더링

개발하다 보면 특정 조건을 만족할 때 내용을 보여 주고, 만족하지 않을 때 아예 아무것도 렌더링 하지 않아야 하는 상황이 올 수 있다. 조건부 연산자(삼항 연산자)로도 구현할 수 있지만 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을 보여 준다.

5. undefined를 렌더링하지 않기

리액트 컴포넌트에서는 함수에서 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;

6. React DOM은 HTML 어트리뷰트 이름 대신 CamelCase 프로퍼티 명명을 규칙으로 사용한다.

- 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

profile
문제를 해결하고 가치를 제공합니다

0개의 댓글