이번엔 저번에 알아본 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
먼저 사용