목표
- 공식문서의 JSX에 대해 알아보기
React를 사용할 때 JSX는 필수가 아닙니다. 빌드 환경에서 컴파일 설정을 하고 싶지 않을 때 JSX 없이 React를 사용하는 것은 특히 편리합니다.
class Hello extends React.Component {
render() {
return React.createElement('div', null, `Hello ${this.props.toWhat}`);
}
}
ReactDOM.render(
React.createElement(Hello, {toWhat: 'World'}, null),
document.getElementById('root')
);
- React의 createElement는 인자로 주어지는 타입에 따라 새로운 React 엘리먼트를 반환한다.
React.createElement( type, [props], [...children] )
- type의 인자로는 태그 이름 문자열(span, div 등), React 컴포넌트 타입, React Flagment 타입 중 하나가 올 수 있다.
class Hello extends React.Component {
render() {
return <div>Hello {this.props.toWhat}</div>;
}
}
ReactDOM.render(
<Hello toWhat="World" />,
document.getElementById('root')
);
React는 JSX 사용이 필수가 아니지만, 대부분의 사람은 JavaScript 코드 안에서 UI 관련 작업을 할 때 시각적으로 더 도움이 된다고 생각합니다. 또한 React가 더욱 도움이 되는 에러 및 경고 메시지를 표시할 수 있게 해줍니다.
function App() {
// 예시 1
const food = "hamburger";
const element1 = <h1>{food} is tasty</h1>;
// 예시 2
const places = ["Seoul", "Busan", "Jeju"];
function print(places) {
let exp = "";
places.forEach((place, iter) =>
exp += `${place}${iter !== places.length - 1 ? "," : ""}`
);
return `${exp} are located in Korea`
}
const element2 = <h1>{print(places)}</h1>
return (
<>
{element1}
{element2}
</>
);
}
// 결과
"hamburger is tasty"
"Seoul,Busan,Jeju are located in Korea"
function getGreeting(user) {
if (user) {
return <h1>Hello, {formatName(user)}!</h1>;
}
return <h1>Hello, Stranger.</h1>;
}
const element = <div tabIndex="0"></div>
const element = <div style={styles.wrapper}></div>
💡 주의
- JSX는 HTML보다는 자바스크립트에 가깝기 때문에 리액트 DOM은 HTML 어트리뷰트 이름 대신 카멜 케이스(camelCase) 프로퍼티 명명 규칙을 사용한다.
- 예를 들어 JSX에서 class는 className이 되고 for는 htmlFor, tabindex는 tabIndex가 된다.
const element = <input type="number" />
return (
<>
{element}
</>
);
닫아 주지 않으면 SyntaxError: Unterminated JSX contents. 라는 에러 문구가 뜬다.
const element = (
<div>
<h1>Hello</h1>
<h2>Have a nice day</h2>
</div>
);
return (
<>
{element}
</>
);
const element = (
<h1 className="greeting">
Hello, world!
</h1>
);
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
// 주의: 다음 구조는 단순화 되었다.
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world!'
}
};