React
React
의 3가지 특징Declarative
)jsx
: HTML + JS 결합한 문법Component-Based
)리액트는 하나의 기능 구현을 위해 여러 종류의 코드를 묶어둔 컴포넌트를 기반으로 개발.
컴포넌트로 분리하면 서로 독립적이고 재사용 가능하기 때문에, 기능 자체에 집중하여 개발할 수 있다.
Learn Once, Write Anywhere
)JSX
JSX
: JavaScript를 확장한 문법JSX
는 JavaScript가 확장된 문법이지만, 브라우저가 바로 실행할 수 있는 JavaScript 코드가 아니다.Babel
Babel
은 JSX를 브라우저가 이해할 수 있는 JavaScript로 컴파일한다.React
에서는 DOM과 다르게 CSS, JSX 문법만을 가지고 웹 애플리케이션을 개발할 수 있다.JSX
를 사용하면 JavaScript 만으로 마크업(markup) 형태의 코드를 작성하여 DOM에 배치할 수 있게 되는 것이다.컴포넌트
라고 한다.JSX
없이 React
를 쓸 수 있을까?JSX 없이도 React 요소를 만들 수 있다.
다만 코드가 복잡하고, 가독성이 떨어지는 단점이 있다.
JSX
활용JSX
규칙opening tag
와 closing tag
로 감싸주어야 한다."className"
으로 표기해야 한다. 대문자로 작성된 JSX 컴포넌트를 따로 사용자 정의 컴포넌트라고 부른다.
map
을 이용한 반복// 데이터가 100개 이상일 때
const posts = [
{ id : 1, title : 'Hello World', content : 'Welcome to learning React!' },
{ id : 2, title : 'Installation', content : 'You can install React via npm.' },
{ id : 3, title : 'reusable component', content : 'render easy with reusable component.' },
// ...
{ id : 100, title : 'I just got hired!', content : 'OMG!' },
];
function Blog() {
return (
<div>
<div>
<h3>{posts[0].title}</h3>
<p>{posts[0].content}</p>
</div>
<div>
<h3>{posts[1].title}</h3>
<p>{posts[1].content}</p>
</div>
{// ...}
<div>
<h3>{posts[99].title}</h3>
<p>{posts[99].content}</p>
</div>
{// ... 98 * 4 more lines !!}
</div>
);
}
배열의 각 요소(post)를 특정 논리(postToElement 함수)에 의해 다른 요소로 지정(map) 한다.
// 배열 메서드 map 활용
function Blog() {
const postToElement = (post) => (
<div>
<h3>{post.title}</h3>
<p>{post.content}</p>
</div>
);
const blogs = posts.map(postToElement);
return <div className="post-wrapper">{blogs}</div>;
}
- React에서는 첫번째 의사코드를 두번째와 같이 적을 수 있다.
- 반복적으로 작성해야 하는 부분만 골라서 배열의 요소로 넣으면 React가 이를 인지하고 모든 요소를 렌더링한다.
- 컴포넌트를 재사용성 있게 만들면 단순 반복되는 코드를 간결하게 작성할 수 있다.
React에서 map
메서드 사용 시, key 속성
을 넣지 않으면 아래와 같이 리스트의 각 항목에 key
를 넣어야 한다는 경고가 표시된다.
key 속성의 위치는 map 메서드 내부에 있는 엘리먼트 즉, 첫 엘리먼트에 넣어주세요.
key 속성값이 반드시 id가 되어야 하나요? id가 존재하지 않으면 어떻게 해야 하나요?
- key 속성값은 가능하면 데이터에서 제공하는 id를 할당해야 한다.
- key 속성값은 id와 마찬가지로 변하지 않고, 예상 가능하며, 유일해야 하기 때문.
- 정 고유한 id가 없는 경우에만 배열 인덱스를 넣어서 해결할 수 있다.
- 배열 인덱스는 최후의 수단(as a last resort)으로만 사용.
// 바른 key 속성값 할당의 예
function Blog() {
// postToElement라는 함수로 나누지 않고 아래와 같이 써도 무방합니다.
const blogs = posts.map((post) => (
<div key={post.id}>
<h3>{post.title}</h3>
<p>{post.content}</p>
</div>
));
return <div className="post-wrapper">{blogs}</div>;
}
Component
root
)이 되는 역할을 한다.