Files
SnowLuma/.pnpm-store/v11/files/5a/47cd0b6b3ff5c462790742fc1a86f70bfb1fd2c22138711a3a2fb80d95dadbb1ff6f4d8526026c2cfb66744a9ed17d528a78c566b2032cc0229c6dd1f7886b
TanTan 2a69b23b47
Dev Build / cleanup (push) Canceled after 0s
Dev Build / typecheck (push) Canceled after 0s
Dev Build / build (linux-arm64, ubuntu-24.04-arm, linux-arm64) (push) Canceled after 0s
Dev Build / build (linux-x64, ubuntu-latest, linux-x64) (push) Canceled after 0s
Dev Build / build (win-x64, windows-latest, win32-x64) (push) Canceled after 0s
Dev Build / dispatch-dev-docker (push) Canceled after 0s
docs: 仓库链接指向本镜像仓库
2026-11-13 09:27:07 +08:00

73 lines
1.8 KiB
Plaintext

'use client'
import React from 'react'
export interface ClientOnlyProps {
/**
* The children to render when the JS is loaded.
*/
children: React.ReactNode
/**
* The fallback component to render if the JS is not yet loaded.
*/
fallback?: React.ReactNode
}
/**
* Render the children only after the JS has loaded client-side. Use an optional
* fallback component if the JS is not yet loaded.
*
* @example
* Render a Chart component if JS loads, renders a simple FakeChart
* component server-side or if there is no JS. The FakeChart can have only the
* UI without the behavior or be a loading spinner or skeleton.
*
* ```tsx
* return (
* <ClientOnly fallback={<FakeChart />}>
* <Chart />
* </ClientOnly>
* )
* ```
*/
export function ClientOnly({ children, fallback = null }: ClientOnlyProps) {
return useHydrated() ? (
<React.Fragment>{children}</React.Fragment>
) : (
<React.Fragment>{fallback}</React.Fragment>
)
}
/**
* Return a boolean indicating if the JS has been hydrated already.
* When doing Server-Side Rendering, the result will always be false.
* When doing Client-Side Rendering, the result will always be false on the
* first render and true from then on. Even if a new component renders it will
* always start with true.
*
* @example
* ```tsx
* // Disable a button that needs JS to work.
* let hydrated = useHydrated()
* return (
* <button type="button" disabled={!hydrated} onClick={doSomethingCustom}>
* Click me
* </button>
* )
* ```
* @returns True if the JS has been hydrated already, false otherwise.
*/
export function useHydrated(): boolean {
return React.useSyncExternalStore(
subscribe,
() => true,
() => false,
)
}
function subscribe() {
return () => {
// noop
}
}