jsx란
import ReactDOM from 'react-dom/client';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<h1>안녕 리액트!</h1>);
위 코드의 마지막줄을 보면 파라미터로 문자열이 아닌 html태그같이 생긴 값을 넘기고 있다.
이렇게 html태그를 사용하는 것은 jsx문법이라고 부른다.
jsx문법은 자바스크립트와 html을 섞어쓸 수 있는 자바스크립트의 확장된 문법이다.
자바스크립트와 일치하는 문법
- id 속성
root.render(<h1 id="header">안녕 리액트!</h1>);
위 코드와 같이 jsx문법 안에 id값을 넣을 수 있다.
자바스크립트와 다른 문법
class
root.render(<h1 className="title">안녕 리액트!</h1>);
class는 사용불가능하다.
자바스크립트에서의 class는 이미 다른 용도로 사용되고 있기 때문이다.
따라서 class를 주고싶다면 위와같이 "className"을 줘야한다.
for
root.render(
<form>
<label htmlFor="name>이름</label>
<input id="name" type="text"/>
</form>
);
input태그에서 사용하는 for도 사용할 수 없다.
for는 자바스크립트에서 반복문에 사용되고있기 때문이다.
for를 사용하려면 위와 같이 "htmlFor"를 사용해야한다.
eventHandler
root.render(
<form>
<label htmlFor="name>이름</label>
<input id="name" type="text" onClick="~~" />
</form>
);
eventHandler의 이름도 조금씩 다르다.
html에서는 전부 소문자로 입력했던 이벤트핸들러들을
onblur=""
onfocus=""
onmousedown=""
아래와같이 카멜케이스로 작성해야한다.
onBlur=""
onFocus=""
onMouseDown=""
카멜케이스 사용 예외
root.render(
<form>
<label htmlFor="name>이름</label>
<input id="name" type="text" data-status="blanked" />
</form>
);
위와같이 비표준속성을 다루는데 사용되는 data-* 속성은 카멜케이스가 아니라 기존의 HTML문법 그대로 작성해야한다.
( 비표준속성은 [dom을 담은 변수].dataset.status 와 같이 접근 가능하다. )
Fragment
root.render(<h1>안녕 리액트!</h1>);
위와같이 jsx문법을 사용할 때에는, 반드시 하나의 태그만을 넘겨야한다.
root.render(<div>
<h1>안녕 리액트!</h1>
<h2>안녕안녕</h2>
</div>);
위와 같이는 가능. div태그 1개만 넘기고있기때문이다.
root.render(
<h1>안녕 리액트!</h1>
<h2>안녕안녕</h2>
);
위와 같이는 불가능. h1, h2 두개의 태그를 넘기고 있기 때문이다.
여러개를 보내야하지만, 필요없는 div를 굳이 쓰고싶지 않을 때에는 fragment를 사용하면 된다.
fragment는 임포트가 필요하다.
import ReactDOM from 'react-dom/client';
import {Fragment} from "react";
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Fragment>
<h1>안녕 리액트!</h1>
<h2>안녕안녕</h2>
</Fragment>);
Fragment는 자주 쓰이기때문에 축약형이 있다.
축약형은 fragment를 임포트하지않고, 이름없는 태그로 감쌀 수 있다.
import ReactDOM from 'react-dom/client';
root.render(<>
<h1>안녕 리액트!</h1>
<h2>안녕안녕</h2>
</>);
코드도 더 깔끔! 이렇게 사용하는 것이 좋겠다.
jsx와 javaScript 같이쓰기
root.render(
<h1>안녕 리액트!</h1>
document.getElementById('root')
);
jsx는 자바스크립트로 변환되어 실행되기때문에 위와같이 javaScript문법도 사용가능하긴하지만 이 외의 사용방법을 알아보자.
1. 변수 사용방법
아래와 같이 jsx문법에 javascript 변수를 함께 사용할 수 있다.
import ReactDOM from 'react-dom/client';
const root = ReactDOM.createRoot(document.getElementById('root'));
const lang = "javaScript";
root.render(<>
<h1>안녕 {lang}!</h1>
<h2>안녕안녕</h2>
</>);
- 중괄호 안에 변수명을 넣어 사용할 수 있다.
- 템플릿 문자열과 비슷해 보이지만, 앞에 $기호가 없다.
2. 자바스크립트 함수 사용 방법
import ReactDOM from 'react-dom/client';
const root = ReactDOM.createRoot(document.getElementById('root'));
const lang = "javaScript";
root.render(<>
<h1>안녕 {lang.toUpperCase()}!</h1>
<h2>안녕안녕</h2>
</>);
- 위 코드처럼 중괄호 안에서 자바스크립트의 함수도 사용할 수 있다.
- 연산자도 사용할 수 있지만(예를들면 <h1>안녕 {lang + 'language'}</h1>), jsx에서 읽기 편하게 작성하는 것이 좋다.
3. html태그의 속성에 사용
const lang = "javaScript";
const imageUrl = '~~~~~~';
root.render(<>
<h1>안녕 {lang}!</h1>
<img src={imageUrl} alt='제품사진' />
</>);
- img태그의 src태그에 변수를 넣은 것 처럼 속성을 넣을 수 있다.
4. 이벤트 핸들러에 사용
function handleClick(){
alert("곧 도착합니다.");
}
root.render(<>
<h1>안녕 {lang}!</h1>
<button onClick={handleClick}>확인</button>
</>);
- 위와같이 함수명을 적을 때에도 중괄호 안에 넣는다.
- 중괄호안에는 자바스크립트의 표현식만 사용할 수 있다. 자바스크립트의 문장은 사용할 수 없다.
- if문, for문, 변수선언 등은 사용할 수 없다.
- 따라서 만약 jsx문법 사용중에 조건문이 꼭 필요하다면, 조건 연산자를 사용하고, 반복문이 꼭 필요하다면 배열의 반복문을 활용할 수 있다.
'React' 카테고리의 다른 글
React - 예제 프로젝트 dicegame 만들기 (0) | 2023.10.16 |
---|---|
React - component and props (0) | 2023.10.16 |
React - 개발 환경 세팅(MAC), 프로젝트 생성 및 실행하기 (1) | 2023.10.16 |
react - 예외 처리 방법 (0) | 2023.03.26 |
React - createContext, provider, reducer (0) | 2022.09.14 |