Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions react/jsx.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
## 결론

<br>

JSX는 자바스크립트에 XML 문법을 추가해 쉽게 리액트 엘리먼트를 표현하도록 확장한 문법이다.
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

리액트가 아니더라도 Babel 등과 함께 JSX를 사용할 수 있는데 "리액트 엘리먼트를 표현"한다는게 적절한 정의일까요?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

유조님 말씀처럼 꼭 리액트 엘리먼트가 틀린말은 아니지만, 리액트에 한정된 설명이 JSX의 정체성보다 살짝 먼것같아요!

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@yujo11 @zereight
흠 조금 생각해볼만한 부분일 것 같네요~
이슈의 카테고리가 React인 점과 현상황에서 React에 의해 적극적으로 활용되고 있다는 점에서 React의 고유한 요소와 연관지어 설명하는게 더 적절하다고 생각했습니다! 사실 한없이 추상화를 하고나면 결국 기존 js 문법에 태그를 통해 정보를 구조화 하는 기능을 추가한 것 말고는 붙일 말이 없을 것 같은데 이걸로 충분히 jsx의 정체성을 이야기했다고 볼 수 있을까요?

Copy link
Copy Markdown

@zereight zereight Nov 3, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아! 저는 jsx 탄생이유가
리액트컴포넌트를 표현하기위해 태어난것인지,
xml문법을 자바스크립트에서 사용할 수 있도록 하기위해 태어난것인지에 대한 뉘앙스가 약간 다르게 느껴져서 그랬어요 ㅎㅎ

틀린말이 아니라! 제가 jsx와 리액트를 분리해서 생각하고 있어서 그랬던거 같아요!!
리액트라는 문맥안에서 @Tanney-102 님 말씀이 좀 더 자연스럽게 전달되는거같아요!


<br>

## 설명

<br>

### 1. XML이란?
- eXtensible Markup Language
- HTML과 유사하게 태그 문법을 사용
- HTML의 목적이 정보를 화면에 어떻게 표현할지 미리 정의된 태그로 나타내는 것이라면 XML의 목적은 태그 이름을 통해 데이터를 그룹화하고 구조화 하는 것이다.
- 예시
```xml
<애플>
<스마트폰>아이폰</스마트폰>
<태블릿>아이패드</태블릿>
<노트북>맥북</노트북>
</애플>
<삼섬>
<스마트폰>갤럭시</스마트폰>
<태블릿>갤럭시탭</태블릿>
<노트북>갤럭시북</노트북>
</삼섬>
```

<br>

### 2. JS를 어떻게 확장할까?
- JSX에서는 태그를 통해 리액트 엘리먼트를 나타낸다.
- JSX 파서는 태그 안의 정보를 이용해 React.createElement를 호출한다.
- 태그의 첫 단어는 type인자로, 태그로 감싼 부분은 children으로 그 외 나머지는 props인자로 취급된다.
```jsx
<elementType prop1="prop1" prop2="prop2">
some text
</type>

// 위 태그는 아래 표현과 동일하다.

React.createElement(elementType, { prop1: "prop1", prop2: "prop2" }, "some text");
```
- 이때, 각 태그는 XML 문법이기에 사용자가 임의로 정의해 사용할 수 있다. 단, 기존 HTML 태그도 함께 지원한다. 이를 동시에 지원하는 방법은 다음과 같다.
- 태그의 첫 단어가 소문자로 시작한다면 이는 문자열로 해석된다.
- 태그의 첫 단어가 대문자로 시작한다면 이는 식별자로 해석된다.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💚

```jsx
<div />
// parse
React.createElement("div");

const Span = "span"
<Span>
// parse
React.createElement(Span);
// Span === "span"이므로
React.createElement("span");
```
- 위와 같은 성질을 이용해 기존 html 태그를 사용할때는 소문자, 사용자 정의 컴포넌트를 사용할 때는 대문자를 사용한다.

<br>

## 요약

<br>
- JSX는 자바스크립트에 XML 문법을 추가해 확장한 문법이다.
- JSX에서 태그는 리액트 엘리먼트를 나타낸다.
- JSX에서는 주로 html 태그를 나타낼때 소문자, 컴포넌트를 나타낼 때 대문자로 시작하는 태그이름을 사용한다.