import
모듈을 불러와 사용하는 것은 원래 브라우저에 없던 기능
브라우저가 아닌 환경에서 js를 실행할 수 있게 해주는 Node.js에서 지원하는 기능.
이러한 기능 브라우저에서도 사용하기 위해 bundler 사용.
대표적 번들러로 웹팩.
번들러 도구를 사용하면 import한 모듈들을 모두 합쳐 하나의 파일 생성
파일들 불러오는 것 웹팩을 loader기능. (css-loader, babel-loader: js파일 불러오면서 최신 js 문법 es5문법으로 변환. 호환 위해)
JSX란?
jsx는 js의 확장 문법이며 xml과 비슷
jsx형식으로 작성된 코드는 번들링 되는 과정에서 바벨을 사용해 일반 js 형태로 변환됨.
// JSX
function App(){
return (
<div>
Hello <b>react</b>
</div>
);
}
// 일반 js
function App(){
return React.createElement("div", null, "Hello ", React.createElement("b", null, "react"));
}
jsx 사용해 쉽고 가독성 높게 ui 렌더링 할 수 있음. html코드 작성과 비슷.
js는 요소 일일이 만들어야 함.
jsx는 리액트로 개발시에 사용되므로 공식 js문법이 아님.
jsx에서는 html태그 뿐만 아니라 컴포넌트도 내부에 작성할 수 있음
컴포넌트를 마치 html태그 쓰듯이 작성.
리액트 컴포넌트에서 요소 여러개를 하나의 요소로 감싸야 함.
ㄴ <div>, <Fragment>등으로.
virtual DOM에서 컴포넌트 변화 감지 효율적으로 비교할 수 있도록 컴포넌트 내부는 DOM트리 구조로 이뤄져야 한다는 규칙 때문
function App() {
return (
<div>
<h1>리액트 안녕!</h1> // 요소가 여러개면 감싸줘야 함.
<h2>잘 작동하니?</h2>
</div>
);
}
import React, { Fragment } from 'react';
// Fragment 컴포넌트 불러와 사용 가능
function App() {
return (
<Fragment>// <>, </> 와 같은 식으로도 가능
<h1>리액트 안녕!</h1>
<h2>잘 작동하니?</h2>
</Fragment>
);
}
function App() {
const name = 'John';
return (
<>
<h1>my name is {name}!</h1>
</>
);
}
function App() {
const name = '리액트';
return (
<div>
{name === '리액트' ? (
<h1>yes</h1>
) : (
<h2>no</h2> // null쓰면 아무것도 렌더링x
)}
</div>
);
}
&& 연산자 사용해 조건부 짧은 코드로 조건부 렌더링 가능
const name = ‘John‘; // 위에서 null일때와 같음
return <div>{name === ‘John‘ && <h1>yes</h1>}</div>;
function App() {
const name = undefined;
return name;
} // 오류 : Nothing was returned from render. This usually means a return statement is missing.
// Or, to render nothing, return null.
return name || ‘값이 undefined입니다.‘; // 수정 1. OR 연산자 사용해 오류 방지
return <div>{name}</div>; // 수정 2. jsx 내부에서는 undefinded 렌더링 괜찮음
function App() {
const name = 'myname'
const style = { // style객체 미리 선언 후 div의 style값 지정
backgroundColor: 'black',
color: 'aqua',
fontSize: '48px',
fontWeight: 'bold',
padding: 16
};
return <div style = {style} >{name}</div>
}
function App() {
const name = 'myname';
return (
<div // 미리 선언하지 않고 바로 style값 지정
style = {{
backgroundColor: 'black',
color: 'yellow',
fontSize: '48px',
fontWeight: 'bold',
padding: 16
}}
>
{name}
</div>
);
}
/* App.css */
.react {
background: aqua;
color: black;
font-size: 48px;
font-weight: bold;
padding: 16px;
}
// App.js
import React from 'react';
import './App.css';
function App() {
const name = '리액트';
// class로 해도 적용되긴 하지만 경고
// Warning: Invalid DOM property `class`. Did you mean `className`?
return <div className="react">{name}</div>;
}
export default App;