본문 바로가기
스터디/2024 - 리액트 스터디

3.1.10 useDebugValue

by 1005ptr 2024. 7. 13.
반응형

커스텀 훅에 디버그 값을 달아둘 수 있다.
DevTools 화면에서 나옴

https://react-ko.dev/reference/react/useDebugValue
https://codesandbox.io/p/devbox/react-dev-forked-7k2h9z?file=%2Fsrc%2FuseOnlineStatus.js%3A28%2C1&welcome=true

import { useSyncExternalStore, useDebugValue } from "react";

export function useOnlineStatus() {
  const isOnline = useSyncExternalStore(
    subscribe,
    () => navigator.onLine,
    () => true,
  );

  const sampleObject = {
    name: "sampleName",
    id: 12,
    skills: ["react", "redux"],
  };
  useDebugValue(isOnline ? "Online2" : "Offline2");
  useDebugValue(isOnline ? sampleObject : "Offline3");
  return isOnline;
}

function subscribe(callback) {
  window.addEventListener("online", callback);
  window.addEventListener("offline", callback);
  return () => {
    window.removeEventListener("online", callback);
    window.removeEventListener("offline", callback);
  };
}

표시

  • devtools의 hooks 부분에 표시
  • Custom Hook의 이름 아래로
  • 입력 순서대로 값이 표시됨

Code Sandbox 엄청 발전했다.

  • VS Code Remote 추가됐는데
  • yarn install 이랑
  • vite 실행까지 자동으로 해줌
  • vite 겁나 빠르다.

useSyncExternalStore

위 사용 예시

  • 변이 가능한 값을 노출하는 브라우저 API와 그 변이 사항을 구독하는 이벤트.

외부 스토어 구독

export function useSyncExternalStore<T>(
	subscribe: (() => void) => () => void,
	getSnapshot: () => T,
	getServerSnapshot?: () => T,
): T {
	const value = getSnapshot();
	const [{inst}, forceUpdate] = useState({inst: {value, getSnapshot}});
	
	useLayoutEffect(() => {
		inst.value = value;
		inst.getSnapshot = getSnapshot;
		
		if (checkIfSnapshotChanged(inst)) {
			forceUpdate({inst});
		}
	}, [subscribe, value, getSnapshot]);
	
	useEffect(() => {
		if (checkIfSnapshotChanged(inst)) {
			forceUpdate({inst});
		}
		const handleStoreChange = () => {
			if (checkIfSnapshotChanged(inst)) {
				forceUpdate({inst});
			}
		};
		return subscribe(handleStoreChange);
	}, [subscribe]);

	useDebugValue(value);
	return value;
}

 

 

 

반응형

댓글