Class 바탕의 코드를 작성할 필요 없이 상태 값과 여러 React의 기능을 사용할 수 있게합니다.
Hook은 함수 컴포넌트에서 React state와 생명주기 기능(lifecycle features)을 연동
할 수 있게 해주는 함수 등이 있습니다. Hook은 class 안에서는 동작하지 않습니다. 대신 class 없이 React를 사용할 수 있게 해주는 것입니다.
1. 컴포넌트 사이에서 상태로직을 재사용하기 어렵습니다.
2. 복잡한 코드를 간단하게 나타낼 수 있습니다.
3. Class는 혼란을 줄 수 있습니다.
import React, { useState } from 'react';
function Example() {
// "count"라는 새 상태 변수를 선언합니다
const [count, setCount] = useState(0);
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
import React, { useState, useEffect } from 'react';
function FriendStatus(props) {
const [isOnline, setIsOnline] = useState(null);
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
useEffect(() => {
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
useContext는 컴포넌트를 중첩하지 않고도 React context를 구독할 수 있게 해줍니다.
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
- 메모이제이션된 콜백을 반환합니다.
- 불필요한 렌더링을 방지하기 위해 참조의 동일성에 의존적인 최적화된 자식 컴포넌트에 콜백을 전달할 때 유용합니다.
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
- 메모이제이션된 값을 반환합니다.
- useMemo는 의존성이 변경되었을 때에만 메모이제이션된 값만 다시 계산하여 모든 렌더링 시 고비용 계산을 방지해 최적화 해줍니다.
- useMemo로 전달된 함수는 렌더링 중에 실행된다는 것을 기억하세요. 통상적으로 렌더링 중에는 하지 않는 것을 이 함수 내에서 적용하면 안됩니다.
일반적인 유스케이스는 자식에게 명령적으로 접근하는 경우입니다.
function TextInputWithFocusButton() {
const inputEl = useRef(null);
const onButtonClick = () => {
// `current` points to the mounted text input element
inputEl.current.focus();
};
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Focus the input</button>
</>
);
}
- DOM에 접근하는 방법으로 사용됩니다.
- useRef()는 순수 자바스크립트 객체를 생성하기 때문하기 때문에 ref 속성보다 유용합니다.
- 본질적으로 useRef는 .current 프로퍼티에 변경 가능한 값을 담고 있는 "상자"라고 표현합니다.
function FancyInput(props, ref) {
const inputRef = useRef();
useImperativeHandle(ref, () => ({
focus: () => {
inputRef.current.focus();
}
}));
return <input ref={inputRef} ... />;
}
FancyInput = forwardRef(FancyInput);
- useImperativeHandle은 ref를 사용할 때 부모 컴포넌트에 노출되는 인스턴스 값을 사용자화(customizes)합니다
- 예시에서
<FancyInput ref={inputRef} />
를 렌더링한 부모 컴포넌트는 inputRef.current.focus()를 호출할 수 있습니다.
- 이 함수는 useEffect와 동일하긴 한데, 모든 DOM 변경 후에 동기적으로 발생합니다.
- DOM에서 레이아웃을 읽고 동기적으로 리렌더링하는 경우에 사용하세요.
- 먼저 useEffect를 사용해 보고 문제가 있다면
그다음으로 useLayoutEffect를 사용해 보기를 권합니다.
function useFriendStatus(friendID) {
const [isOnline, setIsOnline] = useState(null);
// ...
// Show a label in DevTools next to this Hook
// e.g. "FriendStatus: Online"
useDebugValue(isOnline ? 'Online' : 'Offline');
return isOnline;
}
1.useDebugValue는 React 개발자도구에서 사용자 Hook 레이블을 표시하는 데에 사용할 수 있습니다.