메서드 :
아래와 같은 네가지 상황일때 업데이트 한다
메서드 :
메서드 :
라이프사이클 메서드는 컴포넌트 상태에 변화가 있을 때마다 실행되는 메서드다. DOM을 직접 건드려야 하는 상황에서 유용하다.
함수형 컴포넌트에서 할 수 없었던 다양한 작업을 할 수 있게 만들어준 매우 고마운(?) 기능
이미 익숙하다
useState는 가장 기본적인 Hook이다. 함수형 컴포넌트에서 상태를 관리해야 할 때 사용
이 함수가 호출되면 배열을 반환하는데, 그 배열의 첫 번째 원소는 상태값, 두 번째 원소는 상태를 설정하는 (세터)함수이다.
예 :
const [value, setValue] = useState(0);
컴포넌트가 렌더링 될 때마다 작업 수행
앞에서 배운 componentDidMount와 componentDidUpdate를 합친것과 유사하다.
특정 값만 실행하고 싶다면 두번째 파라미터에 조건을 넣어주자. (빈값이면 마운트 될때만 실행됨)
예 :
useEffect(() => {console.log('메세지');}, []);
useState의 상위호환?
첫 번째 파라미터에 함수, 두 번째 파라미터엔 해당 리듀서의 기본값을 넣어 준다.
리듀서란 개념은 다음에 더 자세히 배우게 된다.
예 :
const [state, dispatch] = useReducer(reducer, {value:0});
컴포넌트 내부에서 발생하는 연산을 최적화 할 수 있다.
렌더링하는 과정에서 특정 값이 바뀌었을 때만 연산하고, 바뀌지 않았다면 이전 연산값을 다시 사용하는 방식이다.
예 :
const avg = useMemo(() => getAverage(list),[list]);
위의 useMemo와 상당히 비슷하다.
만들어 놨던 함수를 재사용할 수 있다.
예 :
const func1 = useCallback(e => {setNumber(e.target.value);}, [])
함수형 컴포넌트에서 ref를 쉽게 사용할 수 있도록 해준다.
커스텀Hooks를 만들어 사용할 수도 있고,
다른 개발자가 만든 Hooks도 라이브러리로 설치해 사용할 수 있다.
리액트 메뉴얼에서는 새로 작성하는 컴포넌트의 경우 함수형 컴포넌트와 Hooks 를 사용할 것을 권장한다. 꼭 필요한 상황에서만 클래스형 컴포넌트를 구현하자.
import React, {useState, useMemo, useCallback, useRef} from 'react';
const getAverage = numbers => {
console.log('평균값 계산 중..')
if (numbers.length === 0 ) return 0;
const sum = numbers.reduce((a,b) => a+b);
return sum/numbers.length;
}
const Average = () => {
const [list, setList] = useState([]);
const [number, setNumber] = useState('')
const inputEl = useRef(null);
const onChange = useCallback(e => {
setNumber(e.target.value);
}, [])
const onInsert = useCallback(() => {
const nextList = list.concat(parseInt(number));
setList(nextList);
setNumber('')
inputEl.current.focus();
}, [number,list])
const avg = useMemo(() => getAverage(list), [list])
return(
<div>
<input value={number} onChange={onChange} ref={inputEl}/>
<button onClick={onInsert}>등록</button>
<ul>
{list.map((value,index)=> <li key={index}>{value}</li>)}
</ul>
<div>
<b>평균값:</b> {avg}
</div>
</div>
)
}
export default Average;
으악.. 맵다 ㅠㅠ