
React.createElement는 DOM요소를 객체로 반환하여 Virture DOM 실현시키며, 이것으로 인해 최적의 퍼포먼스를 기대할 수 있다.
// React.createElement
function App() {
return React.createElement('h1',{className: 'title', style: {fontSize: '10px', color: 'blue'}}, 'Hello')
}JSX는 React.createElement 가독성 문제로 HTML과 동일한 형식을 사용 가능하도록 만들었다. 하지만 HTML과 같은 마크업 언어가 아닌 JSX는 JavaScript라는 것을 잊어서는 안된다.
// JSX
function App() {
return <h1 className="title" style={{fontSize: "10px", color: "blue"}}>Hello</h1>
}JSX를 쓸 때, return 문 안에는 반드시 하나의 최상위 태그가 있어야 한다. 이는 React가 하나의 컴포넌트만을 리턴할 수 있기 때문이다. 이때 Fragment를 사용하면 DOM에 별도의 NODE를 추가하지 않고 여러자식을 그룹화 할 수 있다
실제로 사용하지는 않지만 JSX 규칙에 의해 <div>와 같이 감싸는 요소를 정의하면 HTML의 DOM 구조에도 <div>는 적용된다.
function App() {
return (
<div>
<td>Hello</td>
<td>World</td>
</div>
);
}
<table>
<tr>
<div>
<td>Hello</td>
<td>World</td>
</div>
</tr>
</table>
불필요한(의미없는) <div> 생성없이 <React.Fragment>로 감싸서 반환한다면 Fragment는 DOM에 추가되지 않기때문에 실제 Dom Tree는 아래와 같이 구성될것이다.
function App() {
return (
<React.Fragment>
<td>Hello</td>
<td>World</td>
</React.Fragment>
);
}
//또는 <> 구문으로 대체가능함
function App() {
return (
<>
<td>Hello</td>
<td>World</td>
</>
);
}
<table>
<tr>
<td>Hello</td>
<td>World</td>
</tr>
</table>
자바스크립트의 객체를 JSX내에서 사용할 때에는 {}를 사용합니다.
function App() {
const name = 'World'
return (
<h1>Hello {name} </h1>
);
}
<h1>Hello Word</h1>
JavaScript에서 true && expression은 항상 expression으로 평가되고, false && expression은 항상 false로 평가되므로 && 뒤의 엘리먼트는 조건이 true일때 출력이 됩니다. 조건이 false라면 React는 무시합니다.
false로 평가될 수 있는 표현식을 반환하면 뒤에 있는 표현식은 건너뛰지만 false로 평가될 수 있는 표현식이 반환된다는 것에 주의! 아래 예시를 통해 주의해야되는 이유를 참고하자
function App() {
const name1 = undefined;
const name2 = 'World';
const count = 0;
return (
<>
{name1 && <h1>Hello {name1} </h1>}
{name2 && <h2>Hello {name2} </h2>}
{count && <h3>count = {count}</h3>}
</>
);
}
위의 예시에서, count = 0 이므로 false로 표현식은 건너뛰지만 count에 0이 반환된다. 즉, 아래와 같은 결과가 render 메서드에서 반환되므로 주의하셔서 사용이 필요하다.
<h2>Hello Word</h2>
0
React의 JSX 내부에선 for 구문을 이용할 수 없다. 때문에 내장 함수인 map을 사용해야된다.
function App() {
return (
<ul>
{['item1', 'item2'].map(item => (
<li>{item}</li>
))}
</ul>
);
}
<ul>
<li>item1</li>
<li>item2</li>
</ul>