Skip to content

Frequently Asked Questions ​

This page addresses common questions and issues that may arise when working with Enforma.

General Questions ​

What is Enforma? ​

Enforma is a flexible form building library for Vue.js that allows you to create complex forms using different rendering approaches: field-based, schema-based, headless, or a mix of these styles. It provides powerful validation, state management, and UI integration capabilities.

How is Enforma different from other form libraries? ​

Enforma focuses on flexibility in rendering approaches while maintaining a consistent state management system. Key differentiators include:

  • Multiple rendering modes in a single library
  • First-class support for UI library integration
  • Advanced schema capabilities with dynamic expressions
  • Optimized performance even for complex forms
  • Comprehensive validation system

What Vue versions does Enforma support? ​

Enforma is built for Vue 3. It leverages Vue's Composition API and the latest reactivity system for optimal performance.

Getting Started ​

Do I need to use a specific UI library with Enforma? ​

No, Enforma is UI-library agnostic. You can use it with:

  • Built-in presets for PrimeVue and Vuetify
  • Any other UI library by creating a custom preset
  • Your own custom components
  • Headless mode for complete UI freedom

However the library comes with 2 presets: PrimeVue and Vuetify

How do I create a basic form? ​

Here's a simple example:

vue
<template>
  <Enforma :data="formData" :submitHandler="submit">
    <EnformaField name="name" label="Name" />
    <EnformaField name="email" label="Email" />
    <EnformaSubmitButton>Submit</EnformaSubmitButton>
  </Enforma>
</template>

<script setup>
import { ref } from 'vue';
import { Enforma, EnformaField, EnformaSubmitButton } from '@encolajs/enforma';

const formData = ref({
  name: '',
  email: ''
});

function submit(data) {
  console.log('Form submitted:', data);
}
</script>

Form Configuration ​

How do I add validation to my forms? ​

You can add validation at the form level:

vue
<template>
  <Enforma :data="formData" :rules="validators" :submitHandler="submit">
    <EnformaField name="username" label="Username" />
    <EnformaField name="email" label="Email" />
    <EnformaSubmitButton>Submit</EnformaSubmitButton>
  </Enforma>
</template>

<script setup>
const validators = {
  username: 'required|min:3',
  email: 'required|email'
};
</script>

How do I create conditional fields? ​

Use the #default template to access the formController and use v-if :

vue
<template>
  <Enforma :data="formData">
    <template #default="formController">
        <EnformaField 
          name="has_shipping" 
          type="checkbox" 
          label="This order requires shipping" 
        />
        
        <EnformaField 
          name="shipping_address" 
          label="Shipping Address" 
          v-if="formController.getFieldValue('has_shipping')" 
        />
    </template>
  </Enforma>
</template>

For schema forms you should use the if attribute

How do I handle form submission? ​

Use the @submit event:

vue
<template>
  <Enforma :data="formData" :submitHandler="submit">
    <!-- Form fields -->
    <EnformaSubmitButton>Submit</EnformaSubmitButton>
  </Enforma>
</template>

<script setup>
async function submit(data) {
  try {
    // Submit to your API
    const response = await api.submitForm(data);
    // Handle success
  } catch (error) {
    // Handle error
  }
}
</script>

Common Issues ​

Why isn't my form validating? ​

  1. Ensure validators are correctly defined
  2. Check for typos in field names
  3. Ensure your validators are registered correctly

Form is not resetting to the initial values ​

Most likely it's because the default function that creates a clone of the values is not powerful enough for your use-case

My dynamic field conditions aren't working ​

  1. Make sure you're using the correct syntax: $form.fieldName or $form['fieldName']
  2. For nested properties, use optional chaining: $form.address?.city
  3. For array items, ensure correct notation: $form.items[0].name
  4. Check reactivity - make sure form data changes are tracked properly

How do I debug form state? ​

In the Vue Dev Tools, locate the form component (Enforma or HeadlessForm) and see the exposed props and methods.

Form values aren't updating correctly ​

  1. Verify your component preset correctly maps events
  2. For custom components, make sure they emit the correct events
  3. Check for value transformation issues with complex data types

Advanced Usage ​

How do I handle file uploads? ​

Use the file field type:

vue
<template>
  <Enforma :data="formData" :submitHandler="submit">
    <EnformaField 
      name="profileImage" 
      type="file" 
      label="Profile Image" 
      accept="image/*" 
    />
  </Enforma>
</template>

<script setup>
async function submit(data) {
  const formData = new FormData();
  formData.append('file', data.profileImage);
  
  await api.uploadFile(formData);
}
</script>

How do I create custom field components? ​

Check out the guide on how to create your own UI preset and the source code of the Vuetify preset which does exactly that

How do I handle async validation? ​

Check out the async validation recipe

Integration ​

How do I use Enforma with Pinia or Vuex? ​

Connect your store with two-way binding:

vue
<template>
  <Enforma 
    :data="userData" 
    :submitHandler="updateUser"
  >
    <!-- Form fields -->
  </Enforma>
</template>

<script setup>
import { storeToRefs } from 'pinia';
import { useUserStore } from '@/stores/user';

const userStore = useUserStore();
const { userData } = storeToRefs(userStore);

function updateUser(data) {
  userStore.updateUser(data);
}
</script>

Released under the MIT License