Skip to content

Validation Rules ​

Note

We recommend using FormCreate's built-in validation engine for form validation. See Form Validation (v2)

Form props

How to Use Validation Rules in Forms

Validation Rule Description ​

Key NameDescriptionType
requiredMarks the field as required. Validation fails when the value is empty (empty string, empty array, false, undefined, or null)boolean
messageError message to display. Can be a function that returns dynamic message contentstring | (value, rule) => string
validatorCustom validation function. Can return a Promise for async validation(value, rule) => boolean | string | Promise
patternRegular expression for validation. Validation fails if the value doesn't matchRegExp
triggerWhen to trigger validation. Takes precedence over the Form component's validate-trigger attribute. Options: onChange, onBlur, onSubmitstring | string[]
formatterFunction to format the field value before validation(value, rule) => any
validateEmptyWhether validator and pattern should validate empty values. Defaults to true. Set to false to skip validation for empty valuesboolean

Note

  • Vant's validator returns boolean, string, or Promise (no callback needed)
  • Vant's message can be a function that returns dynamic error messages
  • Vant's trigger options: onChange, onBlur, onSubmit
  • Access component and form information via this.rule and this.api in custom validation

Common Validation Examples ​

1. Required Field Validation ​

js
const rule = {
    type: 'input',
    field: 'username',
    title: 'Username',
    validate: [
        { required: true, message: 'Username is required', trigger: 'onBlur' }
    ]
}

2. Length Validation ​

Minimum Length Validation ​

js
const rule = {
    type: 'input',
    field: 'password',
    title: 'Password',
    validate: [
        { 
            required: true, 
            validator: (value) => {
                if (!value || value.length < 6) {
                    return 'Password must be at least 6 characters';
                }
                return true;
            },
            trigger: 'onBlur' 
        }
    ]
}

Maximum Length Validation ​

js
const rule = {
    type: 'input',
    field: 'description',
    title: 'Product Description',
    props: {
        type: 'textarea',
        maxlength: 200,
    },
    validate: [
        { 
            validator: (value) => {
                if (value && value.length > 200) {
                    return 'Description cannot exceed 200 characters';
                }
                return true;
            },
            trigger: 'onBlur' 
        }
    ]
}

3. Regular Expression Validation ​

js
const rule = {
    type: 'input',
    field: 'phone',
    title: 'Phone Number',
    validate: [
        { required: true, message: 'Phone number is required', trigger: 'onBlur' },
        { pattern: /^1[3-9]\d{9}$/, message: 'Please enter a valid phone number', trigger: 'onBlur' }
    ]
}

Email Validation ​

js
const rule = {
    type: 'input',
    field: 'email',
    title: 'Email',
    validate: [
        { required: true, message: 'Email is required', trigger: 'onBlur' },
        { 
            pattern: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/, 
            message: 'Please enter a valid email address', 
            trigger: 'onBlur' 
        }
    ]
}

4. Number Range Validation ​

js
const rule = {
    type: 'stepper',
    field: 'age',
    title: 'Age',
    props: {
        min: 0,
        max: 120,
    },
    validate: [
        { required: true, message: 'Age is required', trigger: 'onChange' },
        { 
            validator: (value) => {
                if (value < 18 || value > 65) {
                    return 'Age must be between 18 and 65';
                }
                return true;
            },
            trigger: 'onChange' 
        }
    ]
}

5. Custom Validation ​

js
const rule = {
    type: 'input',
    field: 'age',
    title: 'Age',
    validate: [
        {
            validator: (value) => {
                if (value < 18) {
                    return 'Age must be at least 18';
                } else if (value > 65) {
                    return 'Age cannot exceed 65';
                }
                return true;
            },
            trigger: 'onBlur'
        }
    ]
}

Custom Validation (Access Other Fields) ​

js
const rule = [
    {
        type: 'input',
        field: 'password',
        title: 'Password',
        validate: [
            { 
                required: true, 
                validator: (value) => {
                    if (!value || value.length < 6) {
                        return 'Password must be at least 6 characters';
                    }
                    return true;
                },
                trigger: 'onBlur' 
            }
        ]
    },
    {
        type: 'input',
        field: 'confirmPassword',
        title: 'Confirm Password',
        validate: [
            { required: true, message: 'Please confirm your password', trigger: 'onBlur' },
            {
                validator: (value) => {
                    // Access other field values via this.api
                    const password = this.api.getValue('password');
                    if (value !== password) {
                        return 'Passwords do not match';
                    }
                    return true;
                },
                trigger: 'onBlur'
            }
        ]
    }
]

6. Asynchronous Validation ​

js
const rule = {
    type: 'input',
    field: 'username',
    title: 'Username',
    validate: [
        { required: true, message: 'Username is required', trigger: 'onBlur' },
        {
            validator: (value) => {
                // Return Promise for asynchronous validation
                return new Promise((resolve) => {
                    checkUsernameExists(value).then(exists => {
                        if (exists) {
                            resolve('Username already exists');
                        } else {
                            resolve(true);
                        }
                    });
                });
            },
            trigger: 'onBlur'
        }
    ]
}

7. Array/Multiple Selection Validation ​

Minimum Selection Validation ​

js
const rule = {
    type: 'checkbox',
    field: 'tags',
    title: 'Product Tags',
    value: [],
    options: [
        { value: '1', label: 'Hot Sale' },
        { value: '2', label: 'New Product' },
        { value: '3', label: 'Recommended' },
        { value: '4', label: 'Limited Time' },
    ],
    validate: [
        { 
            required: true, 
            validator: (value) => {
                if (!value || value.length < 2) {
                    return 'Please select at least 2 tags';
                }
                return true;
            },
            trigger: 'onChange' 
        }
    ]
}

Maximum Selection Validation ​

js
const rule = {
    type: 'checkbox',
    field: 'categories',
    title: 'Product Categories',
    value: [],
    options: [
        { value: '1', label: 'Electronics' },
        { value: '2', label: 'Clothing & Accessories' },
        { value: '3', label: 'Home Goods' },
    ],
    validate: [
        { 
            validator: (value) => {
                if (value && value.length > 2) {
                    return 'Select up to 2 categories';
                }
                return true;
            },
            trigger: 'onChange' 
        }
    ]
}

8. Dynamic Error Messages ​

js
const rule = {
    type: 'input',
    field: 'password',
    title: 'Password',
    validate: [
        { 
            required: true, 
            message: (value, rule) => {
                if (!value) {
                    return 'Password is required';
                }
                if (value.length < 6) {
                    return `Password must be at least 6 characters (currently ${value.length})`;
                }
                return '';
            },
            trigger: 'onBlur' 
        }
    ]
}

9. Combined Validation ​

js
const rule = {
    type: 'input',
    field: 'username',
    title: 'Username',
    validate: [
        { required: true, message: 'Username is required', trigger: 'onBlur' },
        { 
            validator: (value) => {
                if (value.length < 3 || value.length > 20) {
                    return 'Username must be between 3 and 20 characters';
                }
                if (!/^[a-zA-Z0-9_]+$/.test(value)) {
                    return 'Username can only contain letters, numbers, and underscores';
                }
                return true;
            },
            trigger: 'onBlur' 
        }
    ]
}

10. Conditional Validation ​

js
const rule = [
    {
        type: 'switch',
        field: 'enableDiscount',
        title: 'Enable Discount',
        value: false,
    },
    {
        type: 'stepper',
        field: 'discount',
        title: 'Discount Rate',
        props: {
            min: 0,
            max: 1,
            step: 0.1,
            decimalLength: 2,
        },
        validate: [
            {
                validator: (value) => {
                    const enableDiscount = this.api.getValue('enableDiscount');
                    if (enableDiscount && (!value || value <= 0)) {
                        return 'Discount rate must be greater than 0 when discount is enabled';
                    }
                    return true;
                },
                trigger: 'onChange'
            }
        ]
    }
]

11. Validation After Formatting ​

js
const rule = {
    type: 'input',
    field: 'phone',
    title: 'Phone Number',
    validate: [
        { 
            required: true, 
            formatter: (value) => {
                // Remove all non-numeric characters
                return value.replace(/\D/g, '');
            },
            validator: (value) => {
                if (value.length !== 11) {
                    return 'Phone number must be 11 digits';
                }
                if (!/^1[3-9]\d{9}$/.test(value)) {
                    return 'Please enter a valid phone number';
                }
                return true;
            },
            trigger: 'onBlur' 
        }
    ]
}

FormCreate is an open-source project released under the MIT License. Free for personal and commercial use.