React 모던 딥다이브 2.1 - JSX
2 minute read
2.1 JSX란?
- JSX(JavaScript XML)는 React에서 사용되는 페이스북에서 소개한 독자적인 문법으로, 다양한 속성을 가진 트리 구조를 토큰화해 자바스크립트(ECMAScript)로 이용 가능하게 변환하여 사용합니다.
- JSX는 트리 구조의 데이터를 쉽게 작성하기 위한 구문이고 XML과 유사한 내장형 구문을 가지고 있어서 HTML과 비슷한 형태로 마크업을 작성할 수 있습니다. 트랜스파일러를 통해 일반 자바스크립트 형태의 코드로 변환되어 실행됩니다.
import React from "react";
import "./App.css";
function App() {
return (
<div className="App">
<header className="App-header">
<h1>Welcome to My React App</h1>
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
);
}
export default App; // create-react-app 의 App.jsx
2.1.1 JSX의 정의
JSX는 여러 컴포넌트로 나타냅니다.
- JSXElement
- JSXElementName
- JSXAttributes
- JSXChildren
- JSXStrings
JSXElement
- 컴포넌트를 생성하고 렌더링하는 데 사용됩니다. (HTML 태그와 유사한 구조)
- 커스텀 컴포넌트 이름은 대문자로 시작해야 인식가능
Element |
Description |
Example |
JSXOpeningElement |
JSXElement의 시작 부분을 나타내며, < 로 시작하고 태그 이름과 속성을 포함합니다. |
<JSXElement> |
JSXClosingElement |
JSXElement의 끝 부분을 나타내며, </ 로 시작하고 태그 이름을 포함합니다. |
</JSXElement> |
JSXSelfClosingElement |
자체 닫히는 태그를 나타내며, < 로 시작하고 태그 이름과 속성을 포함하며, / 로 닫습니다. |
<JSXElement /> |
JSXFragment |
빈 태그로 이루어진 구조를 나타내며, 여러 컴포넌트를 묶어서 반환할 때 사용. |
<></> |
JSXElementName
- JSXElement의 요소 이름을 정의합니다.
Element |
Description |
Example |
JSXIdentifier |
내부 식별자로, 소문자로 시작하는 컴포넌트의 이름($, _ 가능). |
<$ /> |
JSXNamespacedName |
네임스페이스 조합(JSXIdentifier:JSXIdentifier) (최대 2개) |
<my:component> |
JSXMemberExpression |
객체의 속성에 접근하는 멤버 표현식(JSXIdentifier.JSXIdentifier) (여러 개 가능) |
<my.component.item> |
JSXAttributes
- JSXElement의 속성을 나타냅니다. HTML 태그의 속성과 유사한 방식
Element |
Description |
Example |
JSXAttribute |
JSXElement 속성. (key={value}) |
className="myclass" |
JSXAttributeName |
JSX 속성의 이름. JSXIdentifier, JSXNamespacedName 규칙으로 생성 |
className |
JSXAttributeValue |
JSX 속성의 값. 문자열, 중괄호 {} 로 감싼 표현식, JSXElement. |
"myclass" 또는 {customclass} |
JSXSpreadAttribute |
객체의 속성들을 JSX 요소에 전개합니다. (spread 문법) |
{...props} |
JSXChildren
- JSXElement을 구성하는 자식 요소(JSXText, JSXElement, JSXFragment, JSXChildExpression) 여러 개의 자식 요소 포함 가능.
Element |
Description |
Example |
JSXText |
JSXElement 안에 직접 작성된 텍스트(일반 텍스트로 처리). {,<,>,} 제외한 문자열. |
"simple text" |
JSXElement |
HTML 태그나 다른 컴포넌트. 내부 중첩 가능 |
<JSXElement><span>sample text<span></JSXElement> |
JSXFragment |
여러 자식 요소를 그룹화(DOM 엘리먼트를 추가없이 컨테이너 역할). |
<><ChildElement1 /><ChildElement2 /></> |
JSXChildExpression |
중괄호 {} 표현식. 가변적인 값(JSXChild 리턴)을 표현할 때 사용됩니다. |
{hasLicense ? <ChildElement1 /> : <ChildElement2 />} |
JSXStrings
JSXStrings은 JSXElement에서 사용되는 문자열 리터럴을 나타냅니다. JSXStrings은 JSX 속성 값이나 텍스트 노드로 사용됩니다.
Element |
Description |
Example |
일반 문자열 |
일반적인 문자열 리터럴. |
<div>string literal</div> |
템플릿 리터럴 |
백틱()을 이용한 템플릿 리터럴. | <div>{template literal, ${name}! }</div>` |
|
2.1.2 JSX 예제
import React from "react";
function MyComponent() {
const name = "John Doe";
const user = {
firstName: "Jane",
lastName: "Doe",
};
return (
<div>
{/* This is a comment in JSX */}
<h1>Hello, {name}!</h1>
<p>Welcome to my website.</p>
{/* JSX expressions can be used inside curly braces */}
<p>
{user.firstName} {user.lastName}
</p>
{/* Conditional rendering in JSX */}
{user.firstName === "Jane" && <p>Hey, Jane!</p>}
{/* Using array.map() to render lists */}
<ul>
{[1, 2, 3, 4, 5].map((number) => (
<li key={number}>{number}</li>
))}
</ul>
{/* Using inline styles */}
<div style=>
This div has a light blue background.
</div>
</div>
);
}
export default MyComponent;
2.1.3 JSX의 트랜스파일링
JSX to JS (@babel/plugin-transform-react-jsx)
// JSX
const HelloWorld = (
<div>
<span>hello world</span>
</div>
);
const Title = (
<h3 id="title" onMouseEnter={() => console.log("mouse enter")}>
Hello I'm title
</h3>
);
위 코드를 바벨로 변환한 결과 (https://babeljs.io/)
// JS
const HelloWorld = /*__PURE__*/ React.createElement(
"div",
null,
/*__PURE__*/ React.createElement("span", null, "hello world")
);
const Title = /*__PURE__*/ React.createElement(
"h3",
{ id: "title", onMouseEnter: () => console.log("mouse enter") },
"Hello I'm title"
);
- (JSXElement, {JSXAttributes, JSXChildren, JSXStrings })
Leave a comment