이번엔 저번에 알아본 hook말고 다른 hook들에 대해 알아보도록 하겠다.
const [state, dispatch] = useReducer(reducer, initalArg, init);
useState의 대체 함수(state, action) => newState의 형태로 reducer를 받고 dispatch메서드와 짝의 형태로 현재 state를 반환useState보다 useReducer를 선호하는 경우const initialState = {counst: 0};
function reducer(state, action) {
switch(action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count - 1};
default:
throw new Error();
}
}
function Counter() {
count [state, dispatch] = useReducer(reducer, initialState);
return (
<>
Count: {state.count}
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
<button onClick={() => dispatch({type: 'increment'})}>+</button>
</>
);
}
주의
React는 dispatch 함수의 동일성이 안정적이고 리렌더링 시에도 변경되지 않으리라는 것을 보장
init함수를 세번째 인자로 전달init(initialArg)에 설정됨function init(initialCount) {
return {count: initialCount};
}
function reducer(state, action) {
switch (action.type) {
case 'increment':
return {count: state.count + 1};
case 'decrement':
return {count: state.count -1 };
case 'reset':
return init(action.payload);
default:
throw new Error();
}
}
function Counter({initialCount}) {
const [state, dispatch] = useRedcuer(reducer, initialCount, init);
return (
<>
Count: {state.count}
<button
onClick={() => dispatch({type: 'reset', payload: initialCount})}>
Reset
</button>
<button onClick={() => dispatch({type: 'decrement'})}>-</button>
<button onClick={() => dispatch({type: 'increment'})}>+</button>
</>
);
}
object.is비교 알고리즘 사용)const memoizedCallback = useCallback(
() => {
doSomething(a,b);
},
[a, b],
);
메모이제이션된 콜백을 반환
useCallback은 콜백의 메모이제이션되 버전을 반환useCallback(fn, deps)은 useMemo(() => fn, deps)와 동일주의
의존성 값의 배열이 콜백에 인자로 전달되지 않음
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
메모이제이션된 값을 반환
useMemo는 의존성이 변경되었을 때에만 메모이제이션된 값만 다시 계산useMemo로 전달된 함수는 렌더링 중에 실행useMemo를 사용하지 않도고 동작할 수 있도록 코드를 작성주의
의존성 값의 배열은 함수에 인자로 전달되지 않음
const refContainer = useRef(initialValue);
useRef는 .current 프로퍼티로 전달된 인자(initialValue)로 초기화된 변경 가능한 ref객체를 반환function TextInputWithFocusButton() {
const inputE1 = useRef(null);
const onButtonClick = () => {
//`current` points to the mounted text input element
inputE1.current.focus();
};
return (
<>
<input ref={inputE1} type="text" />
<button onClick={onButtonClick}>Focus the input</button>
</>
);
}
useRef는 .current 프로퍼티에 변경 가능한 값을 담고 있는 "상자"와 같다.
useRef() 순수 자바스크립트 객체 생성useRef는 매변 렌더링시 동일한 ref 객체를 제공useRef는 내용이 변경될때 알려주지 않음.current 프로퍼티를 변형하는 것이 렌더링을 발생시키진 않음callback ref를 사용useImperativeHandle(ref, createHandle, [deps])
useImperativeHandle은 ref를 사용할 때 부모 컴포넌트에 노출되는 인스턴 값을 사용자화함useInmperativeHandle은 forwardRef와 더불어 사용function FancyInput(props, ref) {
const inputRef = useRef();
useImperativeHandle(ref, () => ({
focus: () => {
inputRef.current.focus();
}
}));
return <input ref={inputRef} ... />;
}
FancyInput = forwardRef(FancyInput);
<FancyInput ref={inputRef}/>를 렌더링한 부모 컴포넌트는 inputRef.current.focus()를 호출 가능useEffect와 시그니처 동일useEffect 먼저 사용