책을 읽었다 뿐이지 실제로 써보고 '아 이렇구나' 느낀 건 하나도 없다. 나같은 사람이 리액트로 개발을 한다니 참 신기하구나. 여튼, 회사에서 구매한 템플릿에 책에서 못본 훅이 있어서 함 보고파.
명령다루기
, 이름을 보니까 명령을 내리면 그 명령을 어떻게 다뤄야 하는 지를 hool 으로 받을 거 같다.
ref 직접 참조는 피할 패턴이라고 하지만 초보자에게는 사용성 높다.
dom 조작(인스턴스가 아닌 값 조작으로) & ref 커스터마이즈
함수형 컴포넌트에서 ref 조작을 하게 하려면 필요.
함수형 컴포넌트는 ref 를 걸 수가 없으므로, forwardRef 로 외부에서 내려 보내줘야 함.
클래스 컴포넌트의 ref 는 인스턴스 조작이지만, 요건 훅에서 지정해서 리턴한 값만 조작이 가능해짐
// forwardRef 로 부모 컴포넌트에서 생성한 참조를 전달해줌
const MyInput = React.forwardRef((props, ref) => {
const [val, setVal] = React.useState('');
// 내부에서 ref를 걸고.
const inputRef = React.useRef();
// 이 훅으로 부모에서 전달된 ref 에 반환할 값을 지정함
React.useImperativeHandle(ref, () => ({
// 여기서는 딷 blur() 함수 하나만 반환함
blur: () => {
document.title = val;
inputRef.current.blur();
}
}));
return (
<input
ref={inputRef}
val={val}
onChange={e => setVal(e.target.value)}
{...props}
/>
);
});
const App = () => {
// 빈 ref 만든 후
const ref = React.useRef(null);
const onBlur = () => {
console.log(ref.current); // Only contains one property!
// useImperativeHandle 에서 반환한 blur() 메소드 호출해서
// 간접적으로 자식 컴포넌트를 조작
ref.current.blur();
};
// 전달을 해주면 forwardRef 타고 들어가서 리턴을 받아옴
return <MyInput ref={ref} onBlur={onBlur} />;
};
이거 꼭 $nextTick
같다. 모든 돔 업데이트가 마친 다음에 실행. 이게 useEffect
와 차이점음. 콜백이 브라우저 페인팅에 블락되지 않는 단 점. 그래서 화면 깜빡임을 없앨 수 있다는 거다.
음.. 돔 조작을 하게 되면 화면이 깜빡인다.. 근데 렌더링 중에 useEffect 는 돔 조작을 일어켜서 화면이 깜빡이는 경우가 있다. 그런데 돔이 다 조작된 후에 useLayoutEffect 를 실행하면 깜빡임을 막을 수가 있다... 그런가?
화면 깜빡임(FOUC) 참조. https://webdir.tistory.com/416
useEffect 는 DOM 조작을 하더라도 관찰이 안되는 경우에 쓰고.
useLayoutEffect 는 DOM 조작이나 측정이 필요할 경우에 쓰라람.
이건 이해가 안되어서 예시도 못 쓰겠다. 일단 video.js Player.js 에 한 번 썼는데. 이건... 항복. 몰라몰라.
리액트 개발자 도구에서 사용자가 만든 임의의 훅 레이블을 표시하는데 사용.
리액트 훅 공부 소스 저장소!
https://github.com/SeonHyungJo/react-hook-sample