Setting the file. One moment.
Chapter 12 · Clerk Astro Patterns
Subchapter 12.2
references/astro-react.mdMarkdown2 KBView on GitHub
Also bundled
EvalsInstall the React integration:
npx astro add reactUpdate config:
// astro.config.mjs
import { defineConfig } from "astro/config"
import node from "@astrojs/node"
import react from "@astrojs/react"
import clerk from "@clerk/astro"
export default defineConfig({
integrations: [clerk(), react()],
output: "server",
adapter: node({ mode: "standalone" }),
})Import from @clerk/astro/react (NOT @clerk/astro/components). Add client:load to hydrate:
---
// src/layouts/SiteLayout.astro
import { Show, UserButton, SignInButton } from "@clerk/astro/react"
---
<header>
<nav>
<Show when="signed-out" client:load>
<SignInButton client:load mode="modal" />
</Show>
<Show when="signed-in" client:load>
<UserButton client:load />
</Show>
</nav>
</header>
<slot />client:load is required on every Clerk React component used in .astro files.
Standard React imports from @clerk/astro/react:
// src/components/Header.tsx
import { SignInButton, Show, UserButton } from "@clerk/astro/react"
export default function Header() {
return (
<>
<Show when="signed-out">
<SignInButton />
</Show>
<Show when="signed-in">
<UserButton />
</Show>
</>
)
}Use the component in an Astro page with client:load:
---
import Header from "../components/Header"
---
<Header client:load />Access user data with $userStore from @clerk/astro/client:
// src/components/Username.tsx
import { useSyncExternalStore } from "react"
import { $userStore } from "@clerk/astro/client"
export default function Username() {
const user = useSyncExternalStore($userStore.listen, $userStore.get, $userStore.get)
return <>{user?.firstName}</>
}| Import | From | Use In |
|---|---|---|
SignedIn, SignedOut | @clerk/astro/components | .astro files (SSR) |
Show, UserButton | @clerk/astro/react | .astro files (with client:load) or .tsx files |
$userStore | @clerk/astro/client | React components (via useSyncExternalStore) |