react에는 기본적으로 내장하고 있는 Hooks가 있다.
컴포넌트 사이에서 상태와 관련된 로직을 재사용하기 어렵기 때문 (HOC, render props)에 등장한 것이 바로 hooks이다.
"2018년도에 함수 component는 Hooks가 공개되면서, 라이프 사이클을 구현 가능하게 하였다. => 클로저의 등장!"
Hooks 의 사용 규칙
import React, { useState } from "react" function Hooks(props) { if (!props.isExist) { const [state, setState] = useState(); // Error! } const [state2, setState2] = useState(); // Error! } // react가 여러 훅들을 구분할 수 있는 유일한 정보는 훅이 사용된 순서 뿐이기 때문.
Hooks은 선택적으로 사용. 기존의 코드를 다시 작성할 필요 없이 일부의 component 안에서 Hooks를 사용할 수 있다. 그러나, Hooks가 필요없다면 사용하지 않아도 된다. Hooks는 React를 대체하지 않는다.
const [state, setState] = useState(initialState);
// 구조분해 할당
상태 유지 값과 그 값을 갱신하는 함수를 반환. 최초로 렌더링을 하는 동안, 반환된 state(state)는 첫 번째 전달된 인자(initialState)의 값과 동일하다.
setState 함수는 state를 갱신할 때 사용. 새 state 값을 받아 컴포넌트 리렌더링을 큐에 등록한다.
setState(newState + 1);
// setState와 동일하게 비동기 업데이트
setState(prev => prev + 1);
ex. Class component
// 클래스형 컴포넌트
class Example extends React.Component {
constructor(props) {
super(props);
this.state = {
count: 0
};
}
render() {
return (
<div>
<p>You clicked {this.state.count} times
</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}> Click me </button> </div> );
}
}
ex. 함수형 component
import React, { useState } from 'react';
// 함수 컴포넌트
function Example() {
// 새로운 state 변수를 선언하고, count라 부르겠습니다.
const [count, setCount] = useState(0);
const [isModalActive, setIsModalActive] = useState(false); // 안 좋은 예시
const [state, setState] = useState({
color: "red",
isActive: true,
name: "jt".
password: "sdaf"
})
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}> Click me </button>
<button onClick={() => setIsModalActive(!isModalActive)}>modal btn</button> </div> );
}
Tip.
// 아주 간단한 버전의 useState
const useState = (init = undefined) => {
let value = init;
const getter = () => value
// 클로저
const setter = next => (value = next)
// 클로저
return [getter, setter]
}
const [state, setState] = useState('클로저’)
state()
setState("어려워!”)
state()
useState() 하나에서 모든 상태 값을 관리하면 안될까요? 네.
함수는 상태를 저장하지 않는다. -> 클로저가 필요한 이유
useEffect(function);
useEffect(() => {}, [count])
// 의존성 배열 (배열 안에 담긴 값들을 추적, 그때 마다 업데이트)
클래스형 컴포넌트와 비교한다면 useEffect는 여러가지 라이프 사이클이 합쳐진 형태로 설명할 수 있음.
<setInterval( )>
이 함수가 하는 것은 두 인자값(argument)을 받는데, 첫번째 인자로 실행할 function 함수를 받고, 두번째 인자로 그 함수를 실행하고 싶은 시간(실행할 시간)을 받는다.
ex) setInterval(function, 시간);
사용예시
useEffect(() => {
const timer = serInterval(function, 1000)
return () => clearInterval(timer)
})
Custom useEffect
: 무한 스크롤 (useInfiniteScroll) 예시