Caleb Porzio

Better Vuejs form handling with SparkForm

Jun 2016

So... every time you submit a form to a Laravel backend from a Vue component you do something like...

this.busy = true;

this.$http.post('/api/salad', this.salad)
  .then(response => {
    this.success = true;
    this.busy = false;
  }).catch(errors => {
    this.busy = false;
    this.errors = errors.data;
  }

so pretty much every component with a form in your application has this in its data property...

busy: false,
errors: null,
success: false,

and you might do it a little different as you grow the application or even worse: you have multiple forms in the same component!!!

Enter: SparkForms

If your using Laravel Spark, you have access to a javascript class located here: spark/resources/assets/js/forms/form.js

Now, your data property will look something like...

data() {
  return {
    saladForm: new SparkForm({name: ''})
  }
}

instead of...

data() {
  return {
    busy: false,
    errors: null,
    success: false,
    salad: {name: ''}
  }
}

and when you submit your form (using another class provided by spark: "Spark" - with added properties located here spark/resources/assets/js/forms/http.js) it will look like...

Spark.post('/api/salad', this.saladForm)

if your interested, you can still hook into success or failures:

Spark.post('/api/salad', this.saladForm)
  .then(response => {
    this.saladData = response;
  });

Now, the sparkForm automatically carries the form state with it and gives you access to useful things like:

saladForm.busy
saladForm.success
saladForm.errors.hasErrors()
saladForm.errors.has('name')
saladForm.errors.get('name')
saladForm.errors.forget('name')

See spark/resources/assets/js/forms/form.js and spark/resources/assets/js/forms/errors.js for more available methods.

Now for the most grateful recipient of this new class: The Dom

<!-- Error Message -->
<span class="text-danger" v-if="saladForm.errors.has('name') v-text="saladForm.errors.get('name')></span>

<!-- Submit Button -->
<button type="submit" :disabled="saladForm.busy">

There you go. No more mundane form state tracking. You can thank Taylor Otwell.

- peace