# solid-router-actions > Solid Router actions: action() for mutations, useAction for programmatic calls, useSubmission/useSubmissions for tracking state, form submissions with FormData. - Author: Federico Valla - Repository: vallafederico/solid-ai-rules - Version: 20260131154742 - Stars: 0 - Forks: 0 - Last Updated: 2026-02-06 - Source: https://github.com/vallafederico/solid-ai-rules - Web: https://mule.run/skillshub/@@vallafederico/solid-ai-rules~solid-router-actions:20260131154742 --- --- name: solid-router-actions description: "Solid Router actions: action() for mutations, useAction for programmatic calls, useSubmission/useSubmissions for tracking state, form submissions with FormData." metadata: globs: - "**/*router*" - "**/routes/**/*" --- # Solid Router Actions & Submissions ## Defining Actions Actions handle mutations and form submissions: ```tsx import { action } from "@solidjs/router"; const createTicketAction = action(async (subject: string) => { const response = await fetch("/api/tickets", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ subject }) }); if (!response.ok) { const error = await response.json(); return { ok: false, message: error.message }; } return { ok: true }; }, "createTicket"); ``` ## Using Actions with Forms ```tsx import { action } from "@solidjs/router"; const submitFeedbackAction = action(async (formData: FormData) => { const message = formData.get("message")?.toString(); // Process form data return { success: true }; }, "submitFeedback"); function FeedbackForm() { return (
); } ``` **Form requirements:** - Must have `method="post"` - Action receives `FormData` as first parameter - For file uploads, add `enctype="multipart/form-data"` ## Using Actions Programmatically ```tsx import { useAction } from "@solidjs/router"; function EditUser({ userId }: { userId: string }) { const updateUser = useAction(updateUserAction); const handleSubmit = async (event: SubmitEvent) => { event.preventDefault(); const formData = new FormData(event.currentTarget as HTMLFormElement); await updateUser(userId, formData); }; return ; } ``` ## Action with Multiple Arguments ```tsx const updateUserAction = action(async (userId: string, formData: FormData) => { // ... }, "updateUser"); // Use with .with() helper ``` ## Submissions ### useSubmission Track single form submission state: ```tsx import { useSubmission, Show } from "@solidjs/router"; function AddTodoForm() { const submission = useSubmission(addTodoAction); return ( ); } ``` **Submission properties:** - `input` - Reactive input data - `result` - Successful return value - `error` - Error thrown - `pending` - Boolean indicating if running - `clear()` - Clear submission state - `retry()` - Re-execute with same input ### useSubmissions Track multiple submissions (useful for optimistic UI, lists): ```tsx import { useSubmissions, For } from "@solidjs/router"; function AddTodoForm() { const submissions = useSubmissions(addTodoAction); return (