const element = <h1>Hello, world!</h1>
JavaScript
를 확장한 문법으로 JavaScript
의 모든 기능이 포함되어 있다.React.createElement(component,props,...children)
를 호출하는 편리한 문법컴포넌트
로 작성한다.하나의 엘리먼트
로 감싸야 한다.{}
안에 작성해야 한다.삼항연산자
를 사용해야 한다.className
을 사용해야 한다.a. { } 중괄호
예) const element=<img src={user.avataUrl} />;
b. " " 따옴표 : 속성에 따옴표를 이용하여 문자열 리터럴 정의 가능
예) const element=<div tabIndex="0" />;
주의 : "중괄호{}" 또는 "따옴표(문자열 값에 사용)" 중 하나만 사용
JSX의 중괄호({}) 안에는 유효한 모든 JavaScript 표현식을 넣을 수 있다.
const name='Josh';
const element = <h1>Hello, {name}</h1>
컴파일이 끝나면 JSX 표현식이 정규 JavaScript 함수 호출이 되고 JavaScript 객체
로 인식
JSX는 모든 값을 렌더링하기 전에 문자열로 변환되기 때문에 XSS(cross-site-scription)공격을 방지할 수 있다.
JSX는 React.createElement()
호출로 컴파일을 하며, 객체를 생성한다.
//JSX로 엘리먼트 생성
const element = (
<h1 className="greeting">
Hello, world
</h1>
);
//React.createElement()로 엘리먼트 생성
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world'
);
//기본적으로 아래와 같은 객체를 생성
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world'
}
};
React.createElement()
를 호출하는 편리한 문법일 뿐이며,React.createElement()
를 사용하는 형태로 변환된다.//createElement 기본 형식
React.createElement(
type,
[props],
[...children]
)
리액트는 JSX 사용이 필수는 아니다.
만약 빌드환경에서 컴파일 설정을 하고 싶지 않을 때에는 JSX를 사용하지 않는 것이 편하고,
엘리먼트를 만들고 싶을 때는 React.createElement(component, props, ...children)
으로도 만들 수 있다.
//JSX
class Hello extends React.Component {
render() {
return <div>Hello {this.props.toWhat} </div>;
}
}
ReactDOM.render(
<Hello toWhat="world" />,
document.getElementById('root')
);
//createElement()
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')
);
결론적으로 JSX
는 React.createElement()
를 편하게 호출하는 문법일 뿐이고,
또한 JSX
는 React.createElement()
를 사용하는 형태로 변환된다.