useIsClient
클라이언트 사이드에서 실행될 때는 true를, 서버 사이드에서 실행될 때는 false를 반환하는 훅입니다. 이 훅은 실행 환경을 감지하고 클라이언트 전용 로직을 처리하는 데 유용합니다.
이 훅은 ClientOnly 컴포넌트에서 내부적으로 사용되어 언제 children을 렌더링할지 결정합니다.
import { useIsClient } from '@suspensive/react'
const Example = () => {
const isClient = useIsClient()
return <div>{isClient ? '클라이언트' : '서버'}</div>
}사용 사례
환경에 따른 조건부 렌더링
useIsClient를 사용하여 코드가 클라이언트에서 실행되는지 서버에서 실행되는지에 따라 컴포넌트나 콘텐츠를 조건부로 렌더링할 수 있습니다.
import { useIsClient } from '@suspensive/react'
const Example = () => {
const isClient = useIsClient()
return <div>{isClient ? <ClientOnlyComponent /> : <ServerFallback />}</div>
}클라이언트 전용 로직
useIsClient를 사용하여 하이드레이션 불일치를 일으키지 않고 클라이언트 전용 코드를 안전하게 실행할 수 있습니다.
import { useIsClient } from '@suspensive/react'
import { useEffect, useState } from 'react'
const Example = () => {
const isClient = useIsClient()
const [windowWidth, setWindowWidth] = useState(0)
useEffect(() => {
if (isClient) {
const handleResize = () => setWindowWidth(window.innerWidth)
window.addEventListener('resize', handleResize)
handleResize() // 초기값 설정
return () => window.removeEventListener('resize', handleResize)
}
}, [isClient])
return <div>{isClient ? `창 너비: ${windowWidth}px` : '로딩 중...'}</div>
}안전한 브라우저 API 접근
클라이언트 사이드에서만 사용 가능한 브라우저 API에 안전하게 접근할 수 있습니다.
import { useIsClient } from '@suspensive/react'
const Example = () => {
const isClient = useIsClient()
const handleClick = () => {
if (isClient) {
// 브라우저 API를 안전하게 사용
localStorage.setItem('clicked', 'true')
console.log('클릭됨!')
}
}
return <button onClick={handleClick}>클릭하세요 (클라이언트 전용)</button>
}구현 세부사항
useIsClient는 React의 useSyncExternalStore 훅을 사용하여 구현되어 다음을 보장합니다:
- 일관된 동작: 서버 사이드 렌더링 중에는
false를, 클라이언트에서는true를 반환 - 하이드레이션 불일치 없음: 서버에서 클라이언트로의 전환을 적절히 처리
- 성능: 불필요한 리렌더링 없이 최소한의 오버헤드
훅은 내부적으로 다음을 사용합니다:
getSnapshot:true반환 (클라이언트 환경)getServerSnapshot:false반환 (서버 환경)emptySubscribe: 환경이 컴포넌트 생명주기 동안 변경되지 않으므로 no-op 구독 함수
수정된 날짜: