@tanstack/solid-router
Version:
Modern and scalable routing for Solid applications
64 lines (63 loc) • 1.71 kB
JavaScript
import { createComponent, memo } from "solid-js/web";
import * as Solid from "solid-js";
//#region src/ClientOnly.tsx
/**
* 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>
* )
* ```
*/
function ClientOnly(props) {
const hydrated = useHydrated();
return createComponent(Solid.Show, {
get when() {
return hydrated();
},
get fallback() {
return props.fallback ?? null;
},
get children() {
return memo(() => props.children);
}
});
}
/**
* 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.
* const hydrated = useHydrated()
* return (
* <button type="button" disabled={!hydrated()} onClick={doSomethingCustom}>
* Click me
* </button>
* )
* ```
* @returns True if the JS has been hydrated already, false otherwise.
*/
function useHydrated() {
const [hydrated, setHydrated] = Solid.createSignal(false);
Solid.onMount(() => {
setHydrated(true);
});
return hydrated;
}
//#endregion
export { ClientOnly, useHydrated };
//# sourceMappingURL=ClientOnly.js.map