Skip to content

useDocumentVisibility

作用

监听页面是否可见

原理

这个 hook 主要使用了 Document.visibilityState 这个 API,这个 API 有四个值,分别是 hiddenvisibleprerenderundefined,分别代表隐藏、可见、预渲染、未定义。

源码

ts
import { useState } from 'react'
import useEventListener from '../useEventListener'
import isBrowser from '../utils/isBrowser'

type VisibilityState = 'hidden' | 'visible' | 'prerender' | undefined

// 获取当前页面的可见状态
const getVisibility = () => {
  // 如果不是浏览器环境,直接返回 visible
  if (!isBrowser) {
    return 'visible'
  }
  // 如果是浏览器环境,返回 document.visibilityState
  return document.visibilityState
}

function useDocumentVisibility(): VisibilityState {
  // 保存当前页面的可见状态
  const [documentVisibility, setDocumentVisibility] = useState(() => getVisibility())

  // 监听页面的可见状态
  useEventListener(
    'visibilitychange',
    () => {
      // 设置当前页面的可见状态
      setDocumentVisibility(getVisibility())
    },
    {
      target: () => document,
    },
  )

  // 返回当前页面的可见状态
  return documentVisibility
}

export default useDocumentVisibility

如有转载或 CV 的请标注本站原文地址