Laravel Precognition for Vue 3

2.0.0 · active · verified Sun Apr 19

Laravel Precognition for Vue provides a frontend integration for Laravel's backend-driven "live" validation. It allows Vue 3 applications to anticipate the outcome of form submissions, primarily for real-time validation feedback as users interact with forms. The current stable version is 2.0.0, which notably moved from Axios to the native `fetch` API for network requests. This package is part of the broader Laravel ecosystem, maintaining an active development cadence with regular updates and clear versioning. Its key differentiator is its seamless integration with Laravel's validation rules, simplifying the process of displaying server-side validation errors dynamically in a Vue application without full page reloads, and reducing redundant client-side validation logic.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to set up a simple registration form using `useForm` for live validation. It shows binding form data, triggering validation on input, displaying errors, and submitting the form. The example includes basic error handling and form reset functionality.

import { defineComponent, reactive } from 'vue';
import { useForm } from 'laravel-precognition-vue';

export default defineComponent({
  setup() {
    const form = useForm('post', '/api/register', {
      name: '',
      email: '',
      password: '',
      password_confirmation: '',
    });

    const submit = async () => {
      try {
        await form.submit();
        alert('Registration successful!');
        form.reset();
      } catch (e) {
        console.error('Submission failed:', e);
        // Errors are automatically populated in form.errors
      }
    };

    // Example of real-time validation on input change
    const validateField = (field) => {
      if (form[field]) { // Only validate if field has content
        form.validate(field);
      }
    };

    return { form, submit, validateField };
  },
  template: `
    <form @submit.prevent="submit">
      <div>
        <label for="name">Name</label>
        <input id="name" type="text" v-model="form.name" @input="validateField('name')">
        <div v-if="form.errors.name">{{ form.errors.name }}</div>
      </div>

      <div>
        <label for="email">Email</label>
        <input id="email" type="email" v-model="form.email" @input="validateField('email')">
        <div v-if="form.errors.email">{{ form.errors.email }}</div>
      </div>

      <div>
        <label for="password">Password</label>
        <input id="password" type="password" v-model="form.password" @input="validateField('password')">
        <div v-if="form.errors.password">{{ form.errors.password }}</div>
      </div>

      <div>
        <label for="password_confirmation">Confirm Password</label>
        <input id="password_confirmation" type="password" v-model="form.password_confirmation" @input="validateField('password_confirmation')">
        <div v-if="form.errors.password_confirmation">{{ form.errors.password_confirmation }}</div>
      </div>

      <button type="submit" :disabled="form.processing">Register</button>
      <button type="button" @click="form.reset()">Reset</button>
    </form>
  `
});

view raw JSON →