ClientOnly.tsx 657 B

123456789101112131415161718192021
  1. // components/ClientOnly.tsx
  2. import { useEffect, useState, ReactNode } from 'react';
  3. interface ClientOnlyProps {
  4. // 子组件(仅在客户端渲染)
  5. children: ReactNode;
  6. // 服务器端渲染时的占位内容(可选,默认 null)
  7. fallback?: ReactNode | null;
  8. }
  9. export default function ClientOnly({ children, fallback = null }: ClientOnlyProps) {
  10. const [isClient, setIsClient] = useState<boolean>(false);
  11. useEffect(() => {
  12. // 仅在客户端执行,标记为客户端环境
  13. setIsClient(true);
  14. }, []);
  15. // 服务器端渲染时显示 fallback,客户端渲染时显示 children
  16. return isClient ? children : fallback;
  17. }