state의 값이 변경될 때 자동으로 재랜더링이 되기 때문에 변수 대신에 사용한다.
props : 부모 컴포넌트에서 자식 컴포넌트에 데이터 전달 시 사용(읽기모드)
React는 단방향 데이터 흐름
state : 특정 컴포넌트가 갖는 상태(값)
컴포넌트 내부에서 선언되고 내부에서 값을 변경함
state | Props | |
---|---|---|
유스케이스 | 뷰에 렌더링돼야 하는 컴포넌트의 데이터를 저장하는데 사용 | 데이터, 이벤트 핸들러를 자식 컴포넌트에 전달하는데 사용 |
가변성 | 상태는 데이터를 보유하고 시간이 지남에 따라 변경가능 | props는 바뀔 수 없다. 한 번 설정되면 props를 변경할 수 없음 |
업데이트 | 이벤트 핸들러는 일반적으로 state를 업데이트 함 | 상위 컴포넌트는 하위 컴포넌트에 대한 props를 설정 |
import {useState} from "react";
const App = () =>{
const[value, setValue] = useState(초기값);
return...
}
// 1. setState 내에 변경할 값을 넣기
const [count, setCount] = useState(0);
setCount(count + 1);
// 2. setState에 함수를 넣기
const [count, setCount] = useState(0);
setCount((current)=>{
return current + 1
)}
리액트 컴포넌트는 함수형 컴포넌트(Functional Component)와 클래스형 컴포넌트(Class Component)로 나뉜다.
리액트 초기에는 일반적으로 함수형 컴포넌트(Functional Component)를 사용하였으나, 값의 상태를 관리(state)혹은 Life Cycle Method(생명주기)를 사용하여야 할 때에만 클래스형 컴포넌트를 사용하였다.
특수한 경우를 제외하고는 클래스형 컴포넌트를 사용하지 않았는데 그 이유는 클래스형 컴포넌트의 단점 때문이다.
1. 코드의 구성이 어렵고 Component의 재사용성이 떨어짐
2. 컴파일 단계에서 코드 최적화를 어렵게 함
3. 최신 기술의 적용이 효과적이지 않음
이러한 클래스형 컴포넌트의 단점을 보완하여, 함수형 컴포넌트에서도 클래스형 컴포넌트의 기능들을 사용할 수 있게 한 것이 바로 React Hook이다.
useState
,useEffect
가 존재한다.반복분, 조건문 혹은 중첩된 함수 내에서 호출하면 안되며 반드시 최상위에서만 Hook을 호출해야 한다. 또한 Hook은 랜더링 시 항상 동일한 순서로 호출 되어야 한다.
Hook은 React 함수 내에서만 호출해야 한다. 즉, 리액트 Hook은 함수형 컴포넌트에서 호출해야 하며, 추가적으로 custom hook에서도 호출이 가능하다.
custom hook 이름은 "use"로 시작한다.(권장사항)
const[변수명, 상태를 업데이트할 변수명] = useState(초기값)
예시)
const[status, setStatus] = useState("example");
useEffect
useEffect는 화면이 랜더링 될 때마다, 특정 작업을 실행할 수 있도록 하는 Hook이다.
(자세한 내용은 뒤에서 설명)
useReducer
useReducer는 이 전 상태와 Action을 결합하여, 새로운 상태값을 만든다. 일반적으로 React에서 상태관리를 위해 사용하는 Hook은 useState지만, 좀 더 복잡한 상태 관리가 필요한 경우 reducer를 사용 할 수 있다.
이 외에도
리액트는 컴포넌트 단위로 개발하게 되는데 이 때 각 컴포넌트들은 라이프사이클 즉, 생명주기를 가지고 있다. 생명주기는 생성부터 시작하여 업데이트가 되기도 하며 마지막에는 소멸되는 과정을 거치게 된다.
클래스형 컴포넌트에선 주로 생명주기 메서드를 통해 라이프사이클에 따라 컴포넌트를 조작하는데 이와달리 함수형 컴포넌트에서는 생명주기 메서드가 따로 존재하지 않기 때문에 리액트 훅을 사용하여 생명주기 메서드와 비슷하게 동작하도록 구현한다.
//useEffect 불러오기
import React, {useEffect} from 'react';
...
useEffect(function, deps)
useEffect(() => {
console.log("마운트가 될 때만 실행");
}, []);
useEffect(() => {
console.log("리렌더링 될 때마다 실행");
});
useEffect(() => {
console.log(name);
console.log("name이 업데이트될 때 마다 실행");
}, [name]);
useEffect(() => {
console.log("effect");
console.log(name);
return () => {
console.log('cleanup');
console.log(name);
};
}, []);
출처
State
https://lakelouise.tistory.com/260
https://onlyfor-me-blog.tistory.com/463
https://life-with-coding.tistory.com/510
Hook
https://well-made-codestory.tistory.com/44
라이프사이클
https://whwl.tistory.com/282
https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/