Modèles React SPA
Cette skill couvre
@clerk/reactpour Vite/CRA SPAs. Pour Next.js utilisezclerk-nextjs-patterns. Pour TanStack Start utilisezclerk-tanstack-patterns.
De quoi avez-vous besoin ?
| Tâche | Référence |
|---|---|
| Hooks useAuth / useUser / useClerk | references/hooks.md |
| Routes protégées avec React Router | references/protected-routes.md |
| Formulaires sign-in / sign-up personnalisés | references/custom-flows.md |
| Intégration React Router v6/v7 | references/router-integration.md |
Références
| Référence | Description |
|---|---|
references/hooks.md |
useAuth, garde isLoaded |
references/protected-routes.md |
Modèle ProtectedRoute |
references/custom-flows.md |
Flux useSignIn, useSignUp |
references/router-integration.md |
Configuration React Router v6/v7 |
Configuration
npm install @clerk/react
.env:
VITE_CLERK_PUBLISHABLE_KEY=pk_...
src/main.tsx:
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import { ClerkProvider } from '@clerk/react'
import App from './App.tsx'
const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY
createRoot(document.getElementById('root')!).render(
<StrictMode>
<ClerkProvider publishableKey={PUBLISHABLE_KEY}>
<App />
</ClerkProvider>
</StrictMode>,
)
Modèle Mental
@clerk/react est client uniquement — il n'y a pas d'auth() côté serveur. Tout l'état d'auth provient des hooks.
isLoadeddoit êtretrueavant de faire confiance àisSignedIn— gardez toujours surisLoadeduseClerk()donne accès àsignOut,openSignIn,openUserProfileet d'autres méthodesgetToken()deuseAuth()récupère le JWT de session pour les appels API
Modèle Minimal
import { useAuth } from '@clerk/react'
export function Dashboard() {
const { isLoaded, isSignedIn, userId } = useAuth()
if (!isLoaded) return <div>Loading...</div>
if (!isSignedIn) return <div>Please sign in</div>
return <div>Hello {userId}</div>
}
Route Protégée (React Router v6/v7)
import { Navigate, Outlet } from 'react-router-dom'
import { useAuth } from '@clerk/react'
export function ProtectedRoute() {
const { isLoaded, isSignedIn } = useAuth()
if (!isLoaded) return <div>Loading...</div>
if (!isSignedIn) return <Navigate to="/sign-in" replace />
return <Outlet />
}
<Routes>
<Route element={<ProtectedRoute />}>
<Route path="/dashboard" element={<Dashboard />} />
<Route path="/settings" element={<Settings />} />
</Route>
<Route path="/sign-in" element={<SignIn />} />
</Routes>
Token pour les Appels API
import { useAuth } from '@clerk/react'
export function DataFetcher() {
const { getToken } = useAuth()
async function fetchData() {
const token = await getToken()
if (!token) return
const res = await fetch('/api/data', {
headers: { Authorization: `Bearer ${token}` },
})
return res.json()
}
return <button onClick={fetchData}>Load</button>
}
Pièges Courants
| Symptôme | Cause | Solution |
|---|---|---|
isSignedIn est undefined |
isLoaded est toujours false |
Toujours vérifier isLoaded en premier |
ClerkProvider manquant |
Provider pas à la racine | Envelopper <App> dans main.tsx |
| Variable env indéfinie | Mauvais préfixe Vite | Utiliser VITE_CLERK_PUBLISHABLE_KEY, accéder via import.meta.env |
Token est null |
Utilisateur non connecté | Vérifier la nullabilité du résultat de getToken() |
| Composant sign-in vide | Pas de publishableKey sur le provider |
Passer publishableKey explicitement |
Voir aussi
clerk-setup- Installation initiale de Clerkclerk-custom-ui- Flux personnalisés & apparenceclerk-orgs- Organisations B2B