JSX를 Babel이 컴파일 하는 방법
JSX는 코드를 작성하는 개발자에겐 직관적이고 편리한 것이 사실이지만, 브라우저가 바로 읽을 수는 없다. 이 때 등장하는 것이 JSX를 JavaScript 언어로 컴파일 해주는 Babel인데, Babel이 JSX를 어떻게 컴파일하는지 예시를 통해 React가 실제 동작하는 원리를 파악해보자.
const element = (
<h1 className="greeting">
Hello, world!
</h1>
);
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
기본적으로 바벨은 React.createElement()
메서드를 통해 엘리먼트를 생성하며, 각 인자에는 HTML TAG의 이름, 요소의 속성을 담은 객체, 태그 안에 들어갈 컨텐츠 순으로 들어간다. React.createElement()
는 버그가 없는 코드를 작성하는 데 도움이 되도록 몇 가지 검사를 수행하고, 다음과 같은 객체를 생성한다. 생성되는 객체의 구조를 눈여겨봐두자.
const element = {
type: 'h1',
props: {
className: 'greeting',
children: 'Hello, world!'
}
};
컴포넌트를 생성하는 방법
React의 컴포넌트는 JavaScript 함수를 작성하거나 ES6 문법인 class를 사용해 컴포넌트를 작성할 수 있다.
함수 컴포넌트
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
말 그대로 JavaScript 함수이기 때문에 함수 컴포넌트라 호칭한다. function 선언 없이 화살표 함수로도 작성 가능하다.
클래스 컴포넌트
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
ES6에서 추가된 class 키워드를 사용해 컴포넌트를 생성해서 클래스 컴포넌트라 호칭한다. React.Component
를 상속받아서 작성하고, render
메서드에 실제 생성될 내용을 작성한다. 이 때, 전달받을 props가 있다면 this
를 사용해 전달받을 수 있다.
클래스 컴포넌트에서의 props와 state
상위 컴포넌트에서 props를 전달하면 React.Component
에서 해당 내용을 추가하여 상속하게 한다. 클래스 컴포넌트에서 React.Component
를 상속시켜야 하는 이유.
state
클래스 컴포넌트에서 state를 사용하려면 기본적인 constructor를 추가하고 그 안에 state라는 속성을 추가해야 한다. 속성의 값은 객체로, 객체 내의 키가 state, 값은 초기 값이 된다. 이 때, super()를 이용해 상속받을 부모인 React.Component
의 props를 상속받아야 한다.
class Welcome extends React.Component {
constructor(props){
super(props);
this.state = {hello: "hello"}
}
render() {
return <h1>Hello, {this.state.hello}</h1>;
}
}
상태를 변경하려면 클래스에 새로운 메소드를 만들고 그 안에 this.setState()
를 사용하면 된다. 메서드 안에는 생성할 때 처럼 객체 형태로 작성하면 된다.
class Welcome extends React.Component {
constructor(props){
super(props);
this.state = {hello: "hello"}
}
render() {
return <h1 onClick={() => {this.world()}>{props.name}, {this.state.hello}</h1>;
}
hi(){
this.setState({
hello: "hi"
})
}
}
const Welcome = ({name}) => {
const [hello, setHello] = useState("hello");
const world = () => {
setHello("world");
}
return (
<h1 onClick={world}>{name}, {hello}</h1>
)
}
Uploaded by N2T