useScreen
Custom hook that tracks the screen
dimensions and properties.
Usage
import { useScreen } from 'usehooks-ts'
export default function Component() {
const screen = useScreen()
return (
<div>
The current window dimensions are:{' '}
<code>{JSON.stringify(screen, null, 2)}</code>
</div>
)
}
API
▸ useScreen(options
): Screen
| undefined
Custom hook that tracks the screen
dimensions and properties.
Parameters
Name | Type | Description |
---|---|---|
options | UseScreenOptions <false > | The options for customizing the behavior of the hook (optional). |
Returns
Screen
| undefined
The current Screen
object representing the screen dimensions and properties, or undefined
if not available.
▸ useScreen(options?
): Screen
Custom hook that tracks the screen
dimensions and properties.
Parameters
Name | Type | Description |
---|---|---|
options? | Partial <UseScreenOptions <true >> | The options for customizing the behavior of the hook (optional). |
Returns
The current Screen
object representing the screen dimensions and properties, or undefined
if not available.
Type aliases
Ƭ UseScreenOptions<InitializeWithValue
>: Object
The hooks options.
Type parameters
Name | Type | Description |
---|---|---|
InitializeWithValue | extends boolean | undefined | If true (default), the hook will initialize reading the screen dimensions. In SSR, you should set it to false , returning undefined initially. |
Type declaration
Name | Type | Description |
---|---|---|
debounceDelay? | number | The delay in milliseconds before the state is updated (disabled by default for retro-compatibility). Default ts undefined |
initializeWithValue | InitializeWithValue | If true (default), the hook will initialize reading the screen dimensions. In SSR, you should set it to false , returning undefined initially. Default ts true |
Hook
import { useState } from 'react'
import {
useDebounceCallback,
useEventListener,
useIsomorphicLayoutEffect,
} from 'usehooks-ts'
type UseScreenOptions<InitializeWithValue extends boolean | undefined> = {
initializeWithValue: InitializeWithValue
debounceDelay?: number
}
const IS_SERVER = typeof window === 'undefined'
// SSR version of useScreen.
export function useScreen(options: UseScreenOptions<false>): Screen | undefined
// CSR version of useScreen.
export function useScreen(options?: Partial<UseScreenOptions<true>>): Screen
export function useScreen(
options: Partial<UseScreenOptions<boolean>> = {},
): Screen | undefined {
let { initializeWithValue = true } = options
if (IS_SERVER) {
initializeWithValue = false
}
const readScreen = () => {
if (IS_SERVER) {
return undefined
}
return window.screen
}
const [screen, setScreen] = useState<Screen | undefined>(() => {
if (initializeWithValue) {
return readScreen()
}
return undefined
})
const debouncedSetScreen = useDebounceCallback(
setScreen,
options.debounceDelay,
)
// Handles the resize event of the window.
function handleSize() {
const newScreen = readScreen()
const setSize = options.debounceDelay ? debouncedSetScreen : setScreen
if (newScreen) {
// Create a shallow clone to trigger a re-render (#280).
const {
width,
height,
availHeight,
availWidth,
colorDepth,
orientation,
pixelDepth,
} = newScreen
setSize({
width,
height,
availHeight,
availWidth,
colorDepth,
orientation,
pixelDepth,
})
}
}
useEventListener('resize', handleSize)
// Set size at the first client-side load
useIsomorphicLayoutEffect(() => {
handleSize()
}, [])
return screen
}