React에 대해 알아보고, JSX와 Component 사용하기
동적 사용자 인터페이스를 만들기 위해 2011년 페이스북에서 만든 오픈 소스 JavaScript 라이브러리이다. 데이터 변경이 잦은 복잡하고, 규모가 큰 라이브러리에 적합하다는 장점이 있다.
1. Data Flow
2. Component
3. Virtual Dom
4. Props and State
5. JSX
앱 이름에는 대문자 사용이 불가하며, 대신 대시(-)를 사용한다.
npx create-react-app 앱이름
npx: npm의 자식 명령어로 npm보다 가볍게 패키지를 구성한다.
아래 명령어로 프로젝트를 시작한다.
npm start
처음 프로젝트 생성 시 기본 폴더 구조
반드시 부모 요소 하나가 감싸는 형태를 가져야 한다.
/* 정상 코드1 */
function App() {
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>
)
}
/* 정상 코드2 */
function App() {
return(
<>
<div>Hello</div>
</>
)
}
/* 오류 코드 */
function App() {
return(
<div>Hello</div>
<div>Bye</div>
)
}
JSX 안에서 javaScript 사용이 가능하지만, { } 로 감싸서 사용해야 한다.
/* 정상 코드 */
function App() {
var name = "다롱이";
var animal ="강아지";
return(
<div>
<h2>제 반려동물의 이름은 {name} 입니다.</h2>
<h2> {name}는 {animal}입니다.</h2>
</div>
)
}
실행결과
제 반려동물의 이름은 다롱이 입니다.
다롱이는 강아지입니다.
if와 for문은 javaScript 표현식이 아니기 때문에 삼항 연산자와 같은 조건부 연산자를 사용하거나, 외부에서 계산을 한 후 변수에 담아서 JSX 문법에서 보여준다.
/* AND 연산자: 조건이 만족하지 않을 경우 아무것도 노출되지 않는다. */
function App() {
var a = "7";
var b = "4";
return(
<div>
{(3+5) == 8 ? (<h1>정답입니다!</h1>):<h2>오답입니다!</h2>}
{a>b && (<h1>a가 b보다 큽니다</h1>)}
</div>
)
}
실행결과
정답입니다!
a가 b보다 큽니다
/* 외부에서 계산 */
function App() {
let result = '';
if ( (3+5) == 8 ) {
result = <h1>정답입니다!</h1>;
} else {
result = <h2>오답입니다!</h2>;
}
return(
<div>
{result}
</div>
)
}
/* 즉시 실햄함수 사용 */
function App() {
let result = '';
return(
<div>
{
(() => {
if ( (3+5) == 8 ) {
result = <h1>정답입니다!</h1>;
} else {
result = <h2>오답입니다!</h2>;
}
})()
}
</div>
)
}
스타일을 적용할 때에도 객체 형태로 넣어주어야 하며, 카멜표기법으로 작성해야 한다. 또한 attribute도 카멜표기법으로 작성한다.
class(x) -> className(o)
onclick(x) -> onClick(o)
/* 카멜표기로 작성 */
function App() {
const style = {
backgroundColor: "yellow",
color: "blue"
};
return(
<div className="test" style={style}>
<div style={{
backgroundColor: "yellow",
color: "blue"
}}>
</div>
)
}
MVC View를 독립적으로 구성해 재사용할 수 있고, 새로운 컴포넌트도 만들 수 있다. 데이터(props)를 입력 받아 View(state) 상태에 따라 DOM Node를 호출한다.
기본적인 function 구조를 이용해 짧고 직관적이며 추상적이다. 메모리 자원을 덜 사용한다.
/* 함수형 Component */
import React from 'react';
function FunctionComponent() {
return (
<div>
<h1>FunctionComponent - function</h1>
</div>
)
}
export default FunctionComponent;
State와 lifeCycle 기능 이용이 가능하다. Render 함수가 필수적이다.
/* 클래스형 Component */
import React, { Component } from 'react';
class ClassComponent extends Component {
render() {
return (
<div>
<h1>ClassComponent - class</h1>
);
}
}
export default ClassComponent;
properties를 줄인 표현으로 컴포넌트 속성을 설정할 때 사용하는 요소이다. props는 컴포넌트 끼리 값을 전달하는 수단이다.
/* src/index.js */
import React from 'react';
import ReactDOM from 'react-dom/client';
import FunctionComponent from './FunctionComponent';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<>
<FunctionComponent name="이름"/>
</>
);
/* src/FunctionComponent.js */
import React from 'react';
import PropTypes from 'prop-types';
function FunctionComponent(props) {
return (
<div>
<h1>FunctionComponent - function</h1>
<h5>name: {props.name}</h5>
<h5>location: {props.location}</h5>
{/* props.children: 부모 컴포넌트에서 자식 컴포넌트를 호출할 때 태그 사이에 작성한 문자열*/}
<h5>props.children: {props.children}</h5>
</div>
)
}
//defaultProps: 부모컴포넌트에서 props가 전달되지 않았을때의 기본값 설정
FunctionComponent.defaultProps = {
name: '기본이름',
location: '기본위치'
}
//propTypes: 필수 props를 지정하거나, 타입을 지정할 때 사용
FunctionComponent.propTypes = {
name: PropTypes.string
}
export default FunctionComponent;
/* src/index.js */
import React from 'react';
import ReactDOM from 'react-dom/client';
import ClassComponent from './ClassComponent';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<>
<ClassComponent name="이름"/>
</>
);
/* src/ClassComponent.js */
import React, { Component } from 'react';
import PropTypes from 'prop-types';
/* 클래스형 Component */
class ClassComponent extends Component {
render() {
return (
<div>
<h1>ClassComponent - function</h1>
<h5>name: {this.props.name}</h5>
<h5>location: {this.props.location}</h5>
<h5>children: {this.props.children}</h5>
</div>
);
}
static defaultProps = {
name: '기본이름',
location: '기본위치'
}
static propTypes = {
name: PropTypes.string
}
}