// in index.js
import React from 'react';
/*
* 이렇게 모듈을 불러와서 실행하는건 Node.js에서 지원! (js 실행)
* Node.js에서는 import가 아닌 require 구문으로 패키지를 불러옴
*
* 이러한 기능을 브라우저에서도 사용할 수 있게 번들러를 사용
* (파일을 묶듯이 연결한다는 뜻)
*/
// in App.js
import logo from './logo.svg';
import './App.css';
1) css-loader : CSS 파일을 불러옴
2) file-loader : 웹 폰트, 미디어 파일 등을 불러올 수 있게 해줌
3) babel-loader : JS 파일들을 불러오면서 최신 js문법으로 작성된 코드를 바벨을 사용해 ES5 문법으로 변환! (구버전 웹 브라우저와 호환하기 위함)
import logo from './logo.svg';
import './App.css';
function App() { // 함수형 컴포넌트
// 1. App 이라는 컴포넌트를 만듦
// 2. 프로젝트에서 컴포넌트를 렌더링하면 함수에서 반환하고 있는 내용을 나타냄!
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
</header>
</div>
// 이러한 코드를 JSX라고 부름
);
}
export default App;
function App() {
return (
<div>
Hello <b>react</b>
</div>
);
}
// 이렇게 작성된 코드는 다음과 같이 변환됨
function App() {
return React.createElement("div", null, "Hello ", React.createElement("b", null, "react"));
}
JSX를 사용하면 매우 편하게 UI를 렌더링할 수 있음!
ReactDOM.render() 함수란?
- 컴포넌트를 페이지에 렌더링하는 역할 수행
- react-dom 모듈을 불러와 사용
- Parameters (jsx, document 요소)
첫번째 파라미터) 페이지에 렌더링할 내용을 JSX 형태로 작성
두번째 파라미터) 해당 JSX를 렌더링할 document 내부 요소를 설정
ReactDOM.StrictMode
- 리액트 프로젝트에서 리액트의 레거시 기능들을 사용하지 못하게 하는 기능
- 이를 사용하면 문자열 ref, componentWillMount 등 나중에는 완전히 사라지게 될 옛날 기능을 사용했을 때 경고를 출력
import React from 'react';
function App() {
return (
<h1>안녕!</h1>
<h2>잘 동작하니?</h2>
);
}
export default App;
// 요소 여러 개가 부모 요소 하나에 의하여 감싸져 있지 않기 때문에 오류 발생!
import React from 'react';
function App() {
return (
<div>
<h1>안녕!</h1>
<h2>잘 동작하니?</h2>
</div>
);
}
export default App;
Virtual DOM에서 컴포넌트 변화를 감지해낼 때 효율적으로 비교할 수 있도록 컴포넌트 내부는 하나의 DOM 트리 구조로 이루어져야 한다는 규칙이 있음!
import React from 'react';
function App() {
return (
<Fragment> // === <>
<h1>안녕!</h1>
<h2>잘 동작하니?</h2>
</Fragment> // === </>
);
}
export default App;
오직 메모리상에만 존재하는 경량화된 노드!
import React from 'react';
function App() {
const name = '리액트';
return (
<Fragment> // === <>
<h1>{name} 안녕!</h1>
<h2>잘 동작하니?</h2>
</Fragment> // === </>
);
}
export default App;
조건에 따라 다른 내용을 렌더링헤야 할 때는
1) JSX 밖에서 if문을 사용하여 사전에 값을 설정
2) { } 안에 조건부 연산자를 사용하면 됨! ( === 삼항 연산자)
import React from 'react';
function App() {
const name = '리액트';
return (
<Fragment> // === <>
{name === '리액트' ? (
<h1>리액트입니다.</h1>
) : (
<h2>리액트가 아닙니다.</h2>
)}
</Fragment> // === </>
);
}
export default App;
return <div>{name === '리액트' ? <h1>리액트입니다.</h1> : null}</div>;
// ===
return <div>{name === '리액트' && <h1>리액트입니다.</h1>}</div>;
리액트에서 false를 렌더링할 때는 null과 마찬가지로 아무것도 나타내지 않음!
이 때, falsy한 값인 0은 예외적으로 화면에 나타남
const number = 0;
return number && <div>내용</div>
JSX는 언제 괄호로 감싸야 하나요?
주로 JSX를 여러 줄로 작성할 때 괄호로 감싸고, 한 줄로 표현할 수 있는 JSX는 감싸지 않음
import React from 'react';
function App() {
const name = undefined;
return <div>{name || '리액트'}</div>
}
export default App;
import logo from './logo.svg';
import './App.css';
function App() {
const name = '리액트';
const style = {
backgroundColor: 'white',
color: 'aqua',
fontSize: '14px',
fontWeight: '800',
padding: 16 // 단위를 생략하면 px로 지정
}
return (
<div style={style} className="App"></div>;
/*
미리 선언하지 않고 인라인으로 작성하고 싶다면
<div style={{
backgroundColor: 'black', // 이런식으로 작성!
}}
className="App"
>
{name}
</div>;
*/
);
}
export default App;