출처: 모던 리액트 Deep Dive 3장
const [state, setState]= useState(initialState)
state 초기값 넘겨주지 않으면 undefined
리액트 렌더링 : 함수컴포넌트 return & 클래스 컴포넌트 render() 실행 후 이전 리액트 트리와 비교하여 변경사항만 리렌더링
state가 상수가 아니라 함수/배열 차원이라면?
setState 호출하여 state 값 변경하면 리턴되도록
function useState(initialValue){
let internalState = initialValue;
function state(){
return internalState
}
function setState(newValue){
internalState = newValue
}
return [state,setState]
}
const [value,setValue] = useState(0)
setValue(1);
console.log(value()) //1
+) closure 사용하여 내부에 선언된 setState가 함수 실행 종료 후에도 지역변수인 state 계속 참조할 수 있도록 구현되었다고 추측됨
const [count,setCount] = useState(() => {
console.log('복잡한 연산')
return 0
})
useState 안에 원시값 대신 함수를 넘기는 것
function Component() {
useEffect(() => {
//do something
}, [props, state])
}
인수 : [실행할 부수효과가 포함된 함수, 의존성 배열]
state와 props 변화 속에서 일어나는 렌더링 과정에서 실행되는 부수 효과 함수
return () : 클린업 함수
- 이전 state를 참조해 실행
의존성 배열
- 빈 배열 : 비교할 의존성 없어 최초 렌더링 직후에만 실행, 더이상 실행 x
잘못 사용하면 무한 루프에 빠지기도 함
eslint-disable-line, react-hooks/exhaustive-deps 주석을 이용해 react-hooks/exhaustive-deps 경고 무시
- useEffect 인수 내부에서 사용하는 값 중 의존성 배열에 포함되어 있지 않은 값이 있을 때 발생
componentDidMount에 기반한 접근법 ( 가급적 사용x )첫번째 콜백 인수를 익명보다는 기명 함수로 작성하는 것이 좋음
거대한 useEffect일 수록 성능에 악영향
- 여러 작은 useEffect로 분리
콜백 인수로 비동기 함수 바로 넣을 수 없음
- 내부에서 선언하거나, 즉시 실행 비동기 함수는 가능