사용자 인터페이스를 만들기 위한 JavaScript 라이브러리
서버로부터 새로운 페이지를 가져오지 않고, 현재 페이지를 동적으로 다시 작성하는 방식
HTML
을 함수
, array
, object
에 보관하고 재사용할 수 있기 때문에, 큰 프로젝트일수록 HTML
관리가 편해졌다React Native
)Virtual DOM
을 사용함으로써, 실제 브라우저에 접근하지 않고 화면을 수정하는 것이 가능하다Virtual DOM
, JSX
, Component
, State
, Props
등 다양한 개념에 대해서 배워야 하기 때문에, 학습량이 방대하다VIEW
이외의 기능은 다른 라이브러리를 이용하거나 직접 구현해야한다더블 버퍼링이란, 두 개의 버퍼(메모리 영역)를 사용하여 하나에서 이미지를 준비하고 준비된 이미지를 다른 하나로 복사함으로써 화면을 갱신하는 방식
Virtual DOM
은 더블 버퍼링 기법과 비슷하다자바스크립트의 확장 문법
바벨
을 사용하여 일반 자바스크립트 코드로 변환된다index.html ⟸ index.tsx ⟸ App.tsx
App
컴포넌트를 정의한다index.tsx
에서 App
컴포넌트를 가져온다App
컴포넌트는 ReactDOM.render
메소드를 이용해 실제 DOM에 렌더링한다App
컴포넌트가 index.html
파일의 특정 DOM
요소 안에 렌더링된다Virtual DOM
에서 컴포넌트를 감지할 때, 하나의 돔트리로 구성되어 있어야 비교하는 데 효율적이다div
태그를 많이 사용한다 function App() {
return (
<div>
<div>Hello React!</div>
<p>만나서 반갑습니다.</p>
</div>
);
}
<></>
로 감쌀 수 도 있다{}
로 감싸서 return 안에 삽입할 수 있다 function App() {
let title = '내일 할 일';
return (
<div>
<h1>{title}</h1>
<p>만나서 반갑습니다.</p>
</div>
);
}
className
선택자 키워드를 통해 지정한다 function App() {
let title = '내일 할 일';
return (
<div className="bg">
<h1>{title}</h1>
<p>만나서 반갑습니다.</p>
</div>
);
}
style = {{속성명: '속성값'}}
의 형태로 스타일을 설정할 수 있다 function App() {
let title = '내일 할 일';
return (
<div className="bg">
<h1>{title}</h1>
<p style ={{color: 'red', fontSize: '30px'}}>만나서 반갑습니다.</p>
</div>
);
}
React.FC
를 사용한다React.FC
는 Funtional Component
의 약자이며, 컴포넌트에 대한 명시적인 타입 정의를 제공한다props
의 타입 체크를 할 수 있다props
는 컴포넌트 간에 데이터를 전달하는 방법이다(매개 변수와 유사하다)interface Props {
name: string;
age?: number; // 선택적 프로퍼티
}
const MyComponent: React.FC<Props> = ({ name, age }) => {
return (
<div>
안녕하세요, {name}! 당신의 나이는 {age}가 맞습니까?.
</div>;
)
};
리액트는 일반 변수가 아닌, 상태 변수를 만들어서 데이터를 저장한다
const [post, setPost] = useState('미움받을용기');
Re-render
발생시키지 않고, 다른 상태 변수에 의해 Re-render
될 때, 초기화된다state
)와 속성(props
) 변경 뿐이다useState Hook
을 사용해야한다 useState Hook
은 두 가지 기능을 제공한다import { useState } from 'react';
const {count, setCount} = useState(0);
const handleCountClick = (): void => {
setCount(Count + 1);
};
return (
<div className="App">
<div className="title-nav">
<h1>{title}</h1>
</div>
<div className="list">
<h3>
{post[0]}
<span onClick={handleCountClick}>❤️</span>
{like}
</h3>
<p>발행 날짜</p>
</div>
<div>
)
useState
안에 데이터의 초기 값을 설정useState
는 상태 변수와 setter 함수를 반환한다state setter funcion
의 동작 원리state
와 변경된 state
를 비교 검사한다 Re-render
하고 바뀐 부분이 존재하지 않는다면, Re-render
하지 않는다let [post, setPost] = useState(['고기사줄용기', '더마인드', '도둑맞은집중력']);
<button onClick={() => {
let copyPost = post;
copyPost[0] = '들이받을용기';
setPost(copyPost);
}}>제목 변경
</button>
위와 같이 코드를 작성했을 때, 첫번째 요소가 변경되지 않는다. 이유가 멀까?
post
와 copyPost
는 같은 배열을 가리키는 것을 알 수 있다Re-render
된다그러면 첫번째 요소가 변경되도록 하기 위해서 어떻게 코드를 작성해야할까?
let [post, setPost] = useState(['고기사줄용기', '더마인드', '도둑맞은집중력']);
<button onClick={() => {
let copyPost = [...post];
copyPost[0] = '들이받을용기';
setPost(copyPost);
}}>제목 변경
</button>
copyPost
가 참조한다Re-render
한다리액트 애플리케이션을 구성하는 기본 단위
html
의 내용을 한 단위로 묶어놓은 것이다예시
const Detail: React.FC = () => {
return (
<div className="detail">
<h3>제목</h3>
<h4>내용</h4>
<p>날짜</p>
</div>
);
};
return
안에는 하나의 태그로 시작하여 하나의 태그로 끝나야한다Detail
처럼 대문자로 시작하면, 컴포넌트로 인식한다컴포넌트의 단점
state
변수를 공유하기 불편하다props
)하거나 전역변수(redux
)를 사용하여 공유하는 방법이 있다return
안에는 if-else
를 작성할 수 없다삼항연산자 사용법
{
조건식 ? 조건식 참이라면, 실행할 코드 : 조건식 거짓이라면, 실행할 코드
}
{}
안에 삼항 연산자를 작성해준다 예시
const [detail, setDetail] = useState(false);
const handleDetailClick = (): void => {
detail == true ? setDetail(false) : setDetail(true)
}
...
<h3 onClick={handleDetailClick}>제목<h3>
{
detail == true ? <Detail></Detail> : null
}