Apprends à lancer ton projet React Router 7 de zéro, avec Tailwind, shadcn/ui et validation Zod. Pose des bases saines pour coder ton e-commerce.
avec React Router 7
Posez vos questions 24/7 à notre IA experte en React Router 7
Validez vos acquis avec des quiz personnalisés et un feedback instantané
Les stacks citées dans la vidéo :
👉 On part donc d’un dossier vide et on ajoute uniquement ce dont on a besoin.
1npx create-react-router@latest shop-router2cd shop-router3npm install4npm run dev
create-react-router
génère un projet Vite + React Router 7.localhost:5173
, la page par défaut s’affiche.1git init2git add .3git commit -m "feat: boot React Router 7"4git branch -M main5git remote add origin git@github.com:<ton-user>/shop-router.git6git push -u origin main
Pourquoi tout de suite ?
1npx shadcn-ui@latest init # choix du thème « stone »
1npx shadcn-ui@latest add --all
app/root.tsx
,app/app.css
rempli des variables CSS,1import { Button } from "~/components/ui/button";23export default function Home() {4return (5<main className="grid place-content-center min-h-screen">6<Button className="text-xl">Bienvenue sur Shop Router !</Button>7</main>8);9}
HMR de Vite ↔ Tailwind : la couleur change instantanément.
1npm install zod@3.25 @conform-to/react@ @conform-tozod@3
1import { z } from "zod";23export const LoginSchema = z.object({4email: z.string().email("Email invalide"),5});
1import {2useForm,3getFormProps,4getInputProps,5} from "@conform-to/react";6import { getZodConstraint, parseWithZod } from "@conform-to/zod";7import { Form, useActionData, data, type ActionFunctionArgs } from "react-router";8import { Field } from "~/components/forms"; // composant copié d’EpicStack9import { Button } from "~/components/ui/button";10import { LoginSchema } from "~/utils/login-schema";1112export async function action({ request }: ActionFunctionArgs) {13const fd = await request.formData();14const submission = parseWithZod(fd, { schema: LoginSchema });15if (submission.status !== "success") {16return data({ result: submission.reply() }, { status: 400 });17}18return data({ result: submission.reply() });19}2021export default function Home() {22const actionData = useActionData<typeof action>();2324const [form, fields] = useForm({25lastResult: actionData?.result,26constraint: getZodConstraint(LoginSchema),27onValidate({ formData }) {28return parseWithZod(formData, { schema: LoginSchema });29},30});3132return (33<Form method="POST" {...getFormProps(form)} className="w-80 space-y-5">34<Field35labelProps={{ children: "Email" }}36inputProps={getInputProps(fields.email, { type: "email" })}37errors={fields.email.errors}38/>39<Button className="w-full" type="submit">40Continuer41</Button>42</Form>43);44}
Explications :
useForm
gère l’état, la validation client et la synchro avec la réponse serveur.Field
(issu de l’EpicStack) affiche label + input + erreurs, accessibilité comprise.action()
re-valide côté serveur et renvoie 400
si besoin.Résultat : un champ e-mail qui clignote rouge dès qu’il est invalide… sans écrire une seule ligne de useState
.
1git checkout -b 7-1-initialisation-projet2git add .3git commit -m "feat: Tailwind + shadcn + Zod + Conform + formulaire email"4git push -u origin 7-1-initialisation-projet
Crée la Pull Request, vérifie les fichiers ajoutés (composants shadcn, forms.tsx
, etc.) puis merge vers main
.
Prochaine étape 👉 initialiser Prisma + PostgreSQL pour stocker tes produits et utilisateurs.
Quelle est la principale différence entre les composants client et serveur dans React ?
Quelle technique est recommandée pour éviter les rendus inutiles dans React ?
Quel hook permet de gérer les effets de bord dans un composant React ?
Comment implémenter la gestion des erreurs pour les requêtes API dans React ?
Quelle est la meilleure pratique pour déployer une application React en production ?