Skip to content

Vue Dynamic FormComplex forms, without the complexity.

An open source Vue form engine that keeps your business rules in one readable place, while the design stays fully yours. Built on top of vee-validate.

The Problem It Solves ​

The forms that matter are never three fields and a button. They repeat ("add another applicant"), they branch (person or company), and they carry rules ("if business, require a VAT number"). Hand-built, those rules end up scattered through the UI code until nobody can safely answer "what happens if I change this field?"

Vue Dynamic Form separates how a form behaves from how it looks. The behaviour lives in one plain, readable definition, built on a model inspired by XSD (the schema language behind government, insurance, customs, and tax systems), so the hard cases were battle-tested long before this library existed. The look is built entirely from your own components on top of vee-validate, the most widely used Vue validation library. The whole engine is MIT licensed: no per-developer fees, no production licences, no paywalled features.

Curious how it stacks up against SurveyJS, FormKit, Form.io and the JSON Schema tools? Read Why Vue Dynamic Form.

Live Demo ​

Client Onboarding

A concrete demo for a SaaS team collecting everything needed to onboard a new client. It highlights reusable templates, grouped fields, repeatable contacts, a repeatable choice of systems shown and submitted in the order they were added, mutually exclusive launch paths, and computed fields that become required only when they matter.

Client Onboarding

New client setup

Company details

Core account information for the rollout.

Options are requested from an external source.

Choose an industry to see team size options

Available options for the undefined industry are loaded by an external source using an extra parameter.

Systems to connect

Add the external tools we'll integrate with, in the order they should be set up. Each one gets a number in the order you add it, and that order is submitted with the data.

0 of 4

Project contacts

Anyone who should be looped in on the rollout.

1 contact
1

New contact

Launch approach

Pick one. Only the selected option ends up in the submitted values, but what you filled in for the other option is kept and restored when you switch back.

Review & submit

Quick recap before we kick this off. Anything needs tweaking? Jump back to the step.

Company

Company name
—
Industry
—
Team size
—
Data migration
No

Systems

Systems
None

Contacts

Contact 1
—

Launch approach

Approach
Not chosen

Ready to submit?

We'll create the onboarding workspace and email each contact an invite.

Step 1 of 5 · Who are we onboarding?

IsDirty: false
Touched: false
Valid: true

// form values:
{
  "company": {},
  "projectContacts": [
    {}
  ]
}
    

Fields That Adapt Automatically ​

Most form logic comes down to "if this field has a certain value, show/hide/require/change that other field", and it usually ends up scattered across v-ifs, computed properties, and watch() calls. Here it lives with the field itself: the form definition decides when something happens, and your template decides what that looks like in HTML.

ts
const fields: Metadata[] = [
  { name: 'accountType', type: 'select', ... },
  {
    name: 'vatNumber',
    type: 'text',
    fieldOptions: { label: 'VAT Number' },
    computedProps: [
      (field) => { field.disabled = accountType.value !== 'business' }
    ]
  }
]
vue
<template #text-input="{ fieldMetadata, fieldContext: { value, handleChange } }">
  <input
    type="text"
    :disabled="fieldMetadata.disabled"
    :value="value.value"
    @input="handleChange"
  >
</template>

Vue tracks whatever the function reads and re-runs it when that changes, no watch() needed. And disabled isn't a built-in: it's a property you declare in your template's metadata contract, so the vocabulary of behaviours is entirely yours. Components stay clean and reusable; the form definition is the single source of truth for behaviour.

Learn how →

Next Steps ​

Released under the MIT License.