3장
3. 리액트 기초 개념 알아보기
3.1 리액트 앱 실행 복습
- 리액트앱 실행
npm start - 실행하고 터미널을 종료하면 리액트 앱도 종료된다.
- App() 함수의 반환값이 많아지면 소괄호로 감싼다.
// App.js
function App() {
// return <div className="App"/>;
return (
<div>
<h1>Hello!!!</h1>
</div>
)
}
3.2 첫 번째 리액트 기초 개념 : 컴포넌트
// App.js
function App() {
// return <div className="App"/>;
return (
<div>
<h1>Hello!!!</h1>
</div>
)
}
- 위의 App.js에서 App()을 정의했고 HTML을 반환하고 있다.
- App()함수가 반환한 HTML이 리액트 앱 화면에 그려지게 된다.
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));
// <App /> 이게 바로 App컴포넌트를 임포트하여 사용한 것이다.
- App 컴포넌트가 마치 HTML 태그 같지만 HTML에는 저런 태그가 없다.
- App 컴포넌트가 그려질 위치는 ReactDOM.render() 함수의 두 번쨰 인자로 전달한다.
- 아이디가 ‘root’인 엘리먼트는 index.html에 있다.
// index.html
<!DOCTYPE html>
<html lang="en">
<head>
...
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>
- 리액트는 컴포넌트와 함께 동작하고, 리액트 앱은 모두 컴포넌트로 구성된다.
3.3 두 번째 리액트 기초 개념 : JSX
- 컴포넌트는 js와 HTML을 조합한 JSX라는 문법을 사용해서 만든다. 새로운 문법은 아니다 조합한 거니까.
- 컴포넌트를 만들다 보면 자연스럽게 JSX문법을 어떻게 사용해야 하는지 알 게 된다.
- 예제로 Potato 컴포넌트를 만들겠다. src폴더에 Potato.js 파일을 생성한다.
- 파일 맨 위에
import React from 'react';를 입력한다. - 이 코드를 입력해서 리액트가 JSX를 이해할 수 있다.
// Potato.js
import React from 'react'; // 맨 위에 입력
function Potato() {
return <h3>I LOVE POTATO !!!</h3> // HTML이 아니라 JSX이다.
}
export default Potato; // 마지막 줄에 입력
- 컴포넌트를 작성할 때 중요한 규칙은 이름을 대문자로 시작해야 한다는 점이다.
- 컴포넌트 사용하기
import React from 'react';
import Dog from './Dog'; // 외부 파일은 임포트 해야 한다, ./ : 현재 파일이 있는 폴더
function Potato() {
return <h3>I LOVE POTATO</h3>
}
function Oil() {
return <h2> Oil !!! </h2>
}
function App() {
return (
<div>
<h1>Hello!!!</h1>
<Potato/>
<Oil/>
<Dog/>
</div>
)
}
export default App;
/* Potato, Oil은 내부, Dog는 외부 컴포넌트이다.
Hello!!!
I LOVE POTATO
Oil !!!
Dog Component ~ ~
*/
3.4 세 번째 리액트 기초 개념 : props
- props는 컴포넌트에서 컴포넌트로 전달하는 데이터를 말한다. 함수의 매개변수라고 생각하면 편하다.
- props를 사용해서 컴포넌트에 데이터를 전달할 수 있다.
- props에는 불리언, 숫자, 배열과 같은 다양한 형태의 데이터를 담을 수 있다.
- 주의할 점은
props에 있는 데이터는 문자열인 경우를 제외하면 모두 중괄호로 값을 감싸야 한다는 점이다.
import React from 'react';
function Food(props) {
// Food 컴포넌트에 있는 props에 있는 데이터 "kimchi"를 화면에 출력하는 법
// props를 콘솔로 출력해보면 Object형태가 되는데
// 객체는 점 연산자(.)를 사용한다.
return <h1> I like {props.fav}</h1>;
}
function App() {
return (
<div>
<h1>Hello!!!</h1>
<Food fav="kimchi" /> // fav는 favorite의 줄임말임
<Food fav="순대" />
// 문자열인 '라면'을 제외하고는 전부 중괄로로 감싸고 있지??
<Food fav="라면" somthing={true}, papapapa={['hello', 1, 2, 3, 4, true]}>
</div>
)
}
export default App;
- 자바스크립트의 ES6 문법 중 구조 분해 할당을 사용하면 점 연산자를 사용하지 않아도 된다.
import React from 'react';
function Food({fav}) {
return <h1> I like {fav}</h1>;
}
function App() {
return (
<div>
<h1>Hello!!!</h1>
<Food fav="kimchi" />
<Food fav="오징어" />
</div>
)
}
export default App;
3.5 알아본 것
- 컴포넌트가 무엇인지 JSX를 공부했다.
- JSX 단순히 HTML과 js의 조합한 문법이었다.
- JSX를 이용해 컴포넌트를 작성했다. 컴포넌트 이름은 대문자로 시작, 컴포넌트에 데이터를 전달할 때 props를 사용한다.
- 컴포넌트에 props를 전달하면 props에 있는 데이터가 하나의 객체로 변환되어 컴포넌트(함수)의 인자로 전달되어 컴포넌트에서 사용한다.
- ES6의 구조 분해 할당을 사용하면 props를 좀 더 편리하게 사용할 수 있었다.
- JSX는 엄밀하게 말하면 HTML과 js의 조합은 아니다. 예를 들어 JSX에서는 HTML의 class라는 속성 이름을 className이라고 적어야 한다