DEV Community

Cover image for Speed Up Your React Prototyping with Zero-Boilerplate Forms
Saeed Panahi
Saeed Panahi

Posted on

Speed Up Your React Prototyping with Zero-Boilerplate Forms

The Prototyping Bottleneck Every Developer Knows

Picture this: It's 2 AM during a hackathon. Your team's brilliant idea is taking shape, but you're stuck building yet another form. Again. The validation logic. The conditional fields. The styling. The form state management. You're writing the same boilerplate code you've written a hundred times before, while your clock ticks down.

This scenario plays out daily for indie hackers, startup developers, and hackathon participants. Forms are the backbone of web applications, yet they consistently slow down our prototyping velocity. But what if you could build complete, production-ready forms in minutes instead of hours?

Enter React-Forminate: Forms as Data, Not Boilerplate

React-Forminate flips traditional form building on its head. Instead of writing repetitive component code, you declare your form's structure and behavior in a simple JSON configuration. The library handles all the rendering, validation, and state management for you.

Check the documentation

Here's what a complete product feedback form looks like:

React-Forminate dynamic form

import { DynamicForm, FormDataCollectionType } from "react-forminate";

const feedbackForm: FormDataCollectionType = {
  formId: "productFeedback",
  title: "Product Feedback",
  fields: [
    {
      fieldId: "rating",
      type: "radio",
      label: "How would you rate our product?",
      options: [
        {
          value: "1",
          label: "1 - Poor",
        },
        {
          value: "2",
          label: "2 - Fair",
        },
        {
          value: "3",
          label: "3 - Good",
        },
        {
          value: "4",
          label: "4 - Very Good",
        },
        {
          value: "5",
          label: "5 - Excellent",
        },
      ],
      required: true,
    },
    {
      fieldId: "feedback",
      type: "textarea",
      label: "Your feedback",
      placeholder: "What did you like or dislike?",
      validation: [{ minLength: 10, message: "Please provide more detail" }],
      className: "border border-gray-400 rounded p-2 w-full", //TailwindCSS classes
      labelClassName: "block mb-1 font-medium", //TailwindCSS classes
    },
    {
      fieldId: "contactMe",
      type: "checkbox",
      label: "Can we contact you about this feedback?",
      visibility: {
        dependsOn: "rating",
        condition: "greater_than",
        value: "3", // Only show if rating > 3
      },
      options: [
        {
          value: "yes",
          label: "I confirm that I have parental consent to use this service",
        },
      ],
      description: "Please check this field to be able to submit the form",
    },
    {
      fieldId: "email",
      type: "email",
      label: "Your email",
      required: {
        fn: ({ values }) => values.contactMe === "yes",
        dependsOn: ["contactMe"],
      },
      visibility: {
        dependsOn: ["contactMe"],
        condition: "contains",
        value: "yes",
      },
      className: "border border-gray-400 rounded p-2 w-full", //TailwindCSS classes
      labelClassName: "block mb-1 font-medium", //TailwindCSS classes
    },
  ],
};

export default function ProductFeedback() {
  return (
    <DynamicForm
      formData={feedbackForm}
      onSubmit={(values, isValid) => console.log(values, isValid)}
    />
  );
}
Enter fullscreen mode Exit fullscreen mode

In less than 75 lines of code, we've created:

  • A rating input with required validation
  • A feedback text area with minimum length validation
  • Conditional fields that only appear for positive ratings
  • Dependent required fields
  • Complete form state management
  • Submission handling

Have a look at the code in the Github Link

Why This Changes Everything for Rapid Prototyping

  1. Instant UI with Built-in Best Practices

The form renders with accessible, sensible defaults that follow modern UX patterns. No more:

  • Wiring up Formik or React Hook Form
  • Building custom input components
  • Writing validation schemas
  • Managing conditional field logic
  1. JSON is Your Single Source of Truth

Your form configuration becomes documentation. New team members can understand the form's behavior just by reading the config. Need to modify the form? Update the JSON - no component archaeology required.

  1. Built for Real-World Complexity React-Forminate handles all the edge cases that slow down prototyping:
  • Dynamic fields that show/hide based on other inputs
  • Custom validation with server-side checks
  • Formatted inputs for dates, numbers, etc.
  • File uploads with previews and validation
  • Dependent dropdowns that fetch options from APIs
{
  fieldId: "country",
  type: "select",
  dynamicOptions: {
    endpoint: "/api/countries",
    transformResponse: res => res.map(c => ({ label: c.name, value: c.code }))
  }
}
Enter fullscreen mode Exit fullscreen mode
  1. Painless Styling

Add Tailwind or CSS classes directly in your config. No styled-components or CSS-in-JS needed:

{
  fieldId: "email",
  type: "email",
  className: "border rounded p-2 w-full",
  labelClassName: "block mb-1 font-medium"
}
Enter fullscreen mode Exit fullscreen mode

From Hackathon to Production

What starts as a prototyping tool scales beautifully to production:

  • Performance: Optimized re-renders and validation
  • Accessibility: Proper ARIA attributes and keyboard navigation
  • Type Safety: Full TypeScript support
  • Customization: Override any part of the rendering

Try It On Your Next Project

Next time you're:

  • Prototyping a startup idea
  • Competing in a hackathon
  • Building an internal tool
  • Creating a customer feedback form

Give React-Forminate a try. What would normally take hours comes
together in minutes, letting you focus on what makes your project unique.

Install it today:

npm install react-forminate
Enter fullscreen mode Exit fullscreen mode

Github Link

Your future self—well rested and ahead of schedule—will thank you.

Top comments (1)

Collapse
 
saeed_p_77727604230ce6a9f profile image
Saeed P

That was an awesome library.
Good job