컴포넌트에 여러 요소가 있을 경우 반드시 부모 요소 하나로 감싸야 한다.
❓🤔 리액트 컴포넌트에서는 왜 요소 여러 개를 하나의 요소로 꼭 감싸야 할까?
그 이유는 Virtual DOM에서 컴포넌트 변화를 감지해 낼 때 효율적인 비교를 위해 컴포넌트 내부는 하나의 DOM 트리 구조로 이루어져야 한다는 규칙이 있기 때문!
// 1) 잘못된 문장
import React from 'react';
function App() {
return (
<h1>리액트 안녕!</h1>
<h2>잘 작동하니?</h2>
)
}
export default App;



// 2) 올바른 문장
import React from 'react';
function App() {
return (
<div>
<h1>리액트 안녕!</h1>
<h2>잘 작동하니?</h2>
</div>
);
}
export default App;
// 3-1) div 요소를 사용하고 싶지 않을 때 (올바른 문장)
// import 구문에 react 모듈에 들어 있는 Fragment 컴포넌트를 사용하면 됨!
import React, { Fragment } from 'react';
function App() {
return (
<Fragment>
<h1>리액트 안녕!</h1>
<h2>잘 작동하니?</h2>
</Fragment>
);
}
export default App;
// 3-2) Fragment는 다음과 같은 형태로 작성 가능
// 3-1보다 간단함.
import React from 'react';
function App() {
return (
<>
<h1>리액트 안녕!</h1>
<h2>잘 작동하니?</h2>
</>
);
}
export default App;

JSX 안에서는 자바스크립트 표현식을 쓸 수 있다.
❓🤔 어떻게???
JSX 내부에서 코드를 { }로 감싸면 됨!
import React from 'react';
function App() {
const name = '리액트';
return (
<>
<h1>{name} 안녕!</h1>
<h2>잘 작동하니?</h2>
</>
);
}
export default App;
(+) ES6(ECMAScript 6)의 const와 let
let과 const를 사용할 때 같은 블록 내부에서 중복 선언이 불가능! 쉽게 말해 기본적으로 const를 사용하고, 해당 값을 바꾸어야 할 때는 let을 사용하면 된다.
const
한번 지정하면 변경 불가능한 상수를 선언할 때 사용
let
동적인 값을 담을 수 있는 변수를 선언할 때 사용
JSX 내부의 자바스크립트 표현식에서 if 문을 사용할 수는 없다.
❓🤔 만약 조건에 따라 다른 내용을 렌더링해야 한다면?
이 두 방법을 사용하면 된다.
// 예시
import React from 'react';
function App() {
const name = '리액트';
return (
<div>
{name === '리액트' ? (
<h1>리액트입니다.</h1>
) : (
<h2>리액트가 아닙니다.</h2>
)}
</div>
);
}
export default App;

이때 name 값을 다른 값으로 바꾼다면?

‘리액트가 아닙니다.’라는 문구가 뜨겠죠~?
특정 조건을 만족할 때 내용을 보여 주고, 만족하지 않을 때 아예 아무것도 렌더링하지 않아야 할 경우가 발생했다면?
조건부 연산자(삼항연산자)를 통해 구현할 수 있음!
📍 논리연산자 AND(&&)란?
- 둘 이상의 조건이 모두 참(true)일 때 → 전체 결과 참(true) 반환
- 둘 중 하나라도 거짓(false)일 때 → 첫 번째 false 값을 만나면 평가를 중단하고 전체 결과 거짓(false) 반환
import React from 'react';
function App() {
const name = '뤼왝트';
return <div>{name === '리액트' ? <h1>리액트입니다.</h1> : null}</div>;
}
export default App;

null을 렌더링하면 아무것도 보여 주지 않는데, 보다 더 짧은 코드로도 가능하다.
AND 연산자(&&)를 사용해서 조건부 렌더링을 하는 것!
import React from 'react';
// AND 연산자(&&) 사용
function App() {
const name = '뤼왝트';
return <div>{name === '리액트' && <h1>리액트입니다.</h1>}</div>;
}
export default App;

(+) 알아두면 좋은 내용!
⚠️ falsy 값은 주의하자!
- falsy란?
자바스크립트에서 '거짓처럼 취급되는 값'을 뜻한다.
자바스크립트에는 값 자체가 false가 아니지만, 조건문에서 false처럼 작동하는 값들이 존재하는데 이러한 값을 falsy, 그 반대는 truthy라고 한다.
- 주요 falsy 값
false, 0, "", null, undefined, NaN
리액트 컴포넌트에서는 함수에서 undefined만 반환해 렌더링하는 상황을 만들면 안 됨!
❓🤔 왜 undefined를 렌더링하면 안 될까?
렌더링 과정에서의 오류 발생 가능성
undefined는 화면에 그릴 수 있는 데이터 타입이 아니기 때문에 에러가 발생할 수 있으므로 컴포넌트는 반드시 null이나 JSX 요소 같은 특정한 타입을 반환해야 한다.
유지보수 및 디버깅의 어려움
의도적인 빈 화면(null 반환)이 아닌데 undefined를 반환하게 되면, 의도하지 않은 상태에서 아무것도 표시되지 않는 문제가 발생하게 된다.
❓🤔 그럼... 어떤 값이 undefined일 수도 있다면?
// 틀린 코드
import React from 'react';
import './App.css';
function App() {
const name = undefined;
return name;
}
export default App;

// OR(||) 연산자를 사용한 코드
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 || '리액트'}</div>;
}
export default App;

DOM 요소에 스타일을 적용할 때 문자열 형태가 아니라 객체 형태로 넣어 준다.
스타일 이름 중 하이픈(-) 문자가 포함된 것은 카멜 표기법(camelCase)으로 작성한다.
// style 객체를 미리 선언하고 div의 style 값으로 지정
import React from 'react';
function App() {
const name = '리액트';
const style = {
// 카멜 표기법으로 작성
// background-color -> backgroundColor
backgroundColor: 'black',
color: 'aqua',
fontSize: '48px', // font-size -> fontSize
fontWeight: 'bold', // font-weight -> fontWeight
padding: 16 // 단위를 생략하면 px로 지정됨
};
return <div style={style}>{name} </div>;
}
export default App;

// 미리 선언하지 않고 바로 style 값을 지정할 경우
import React from 'react';
function App() {
const name = '리액트';
return (
<div
style={{
backgroundColor: 'black',
color: 'aqua',
fontSize: '48px',
fontWeight: 'bold',
padding: 16
}}
>
{name}
</div>
);
}
export default App;

HTML에서 CSS 클래스를 사용할 때는 class라는 속성을 설정한다
<div class="myclass"> </div>
JSX에서는 class가 아닌 className으로 설정한다.
/* src/App.css */
background: aqua;
color: black;
font-size: 48px;
font-weight: bold;
padding: 16px;
}
// src/App.js 파일
// 기존 App 컴포넌트에서 인라인 스타일에 사용한 폰트 색상과 배경색을 뒤바꾼 스타일로
// App.js 파일에서 상단에 App.css를 불러온 뒤, div 요소에 className 값을 지정
import React from "react"
import '././common/App.css';
function App() {
const name = '리액트';
return <div className="react">{name}</div>;
}
export default App;

HTML 코드를 작성할 때 가끔 태그를 닫지 않은 상태로 코드를 작성하기도 하는데, 그래도 작동된다.
// 태그를 닫지 않은 HTML 코드
// 하지만 동작은 잘 됨!
<form>
성: <br>
<input><br>
이름: <br>
<input>
</form>
하지만, JSX에서는 태그를 닫지 않으면 오류가 발생한다. 오류를 방지하려면 2-1)처럼 태그를 잘 닫아줘야 한다.
태그 사이에 별도의 내용이 들어가지 않을 경우에는 2-2)처럼 태그를 선언하면서 동시에 닫을 수 있는 self-closing 태그 를 사용하면 된다.


// 1) 태그를 닫지 않은 코드
import React from 'react';
import './App.css';
function App() {
const name = '리액트';
return (
<>
<div className="react">{name}</div>
<input>
</>
);
}
export default App;
// 2-1) 태그를 잘 닫은 코드
import React from 'react';
import './App.css';
function App() {
const name = '리액트';
return (
<>
<div className="react">{name}</div>
<input></input>
</>
);
}
export default App;
// 2-2) self-closing 태그
import React from 'react';
import './App.css';
function App() {
const name = '리액트';
return (
<>
<div className="react">{name}</div>
<input />
</>
);
}
export default App;

JSX 안에서 주석을 작성하는 방법은 일반 자바스크립트에서 주석을 작성할 때와 조금 다르다.
👉 JSX 안에서 주석 작성하는 방법
{/* 주석 작성 방법 */}
import React from 'react';
import './App.css';
function App() {
const name = '리액트';
return (
<>
{/* 주석은 이렇게 작성합니다. */}
<div
className="react" // 시작 태그를 여러 줄로 작성하게 된면 여기에 주석 작성할 수 있음.
>
{name}
</div>
// 하지만 이런 주석이나
/* 이런 주석은 페이지에 그대로 나타남. */
<input />
</>
);
}
export default App;
