如何在 React 中实现一个自定义 Hook 来监听页面是否可见(即用户是否切换到了其他标签页或最小化了浏览器)?

如何在 React 中实现一个自定义 Hook 来监听页面是否可见(即用户是否切换到了其他标签页或最小化了浏览器)?

回答:
可以使用浏览器的 Page Visibility API 结合 React 的 useState 和 useEffect 来创建一个自定义 Hook,例如 usePageVisibility。

示例代码:

import { useState, useEffect } from 'react';

function usePageVisibility() {
  const [isVisible, setIsVisible] = useState(!document.hidden);

  useEffect(() => {
    const handleVisibilityChange = () => {
      setIsVisible(!document.hidden);
    };

    document.addEventListener('visibilitychange', handleVisibilityChange);

    return () => {
      document.removeEventListener('visibilitychange', handleVisibilityChange);
    };
  }, []);

  return isVisible;
}

// 使用示例
function App() {
  const isVisible = usePageVisibility();

  return (
    <div>
      页面当前{isVisible ? '可见' : '不可见'}
    </div>
  );
}

解析:

  • Page Visibility API 提供了 document.hidden 属性和 visibilitychange 事件,用于检测页面是否对用户可见。
  • 自定义 Hook usePageVisibility 封装了该逻辑,通过 useEffect 添加和清理事件监听器。
  • 初始状态设为 !document.hidden,确保组件首次渲染时获取正确的可见性状态。
  • 该 Hook 返回一个布尔值,便于在组件中响应页面可见性变化,比如暂停视频播放、停止轮询等场景。

发表评论 (审核通过后显示评论):

昵称:
邮箱:
内容: