Bird
Raised Fist0
Vueframework~5 mins

POST requests for form submission in Vue

Choose your learning style10 modes available
Introduction

POST requests send data from a form to a server safely. They help save or update information.

When a user fills out a signup or login form.
When submitting a comment or feedback on a website.
When uploading data like a profile update or settings change.
When sending order details in an online shop checkout.
When sending sensitive data that should not appear in the URL.
Syntax
Vue
<template>
  <form @submit.prevent="submitForm">
    <!-- form inputs here -->
  </form>
</template>

<script setup>
import { ref } from 'vue'

const formData = ref({})

async function submitForm() {
  const response = await fetch('URL', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(formData.value)
  })
  // handle response
}
</script>

Use @submit.prevent to stop the page from reloading on submit.

Always set Content-Type to application/json when sending JSON data.

Examples
Basic form with a name input and submit button.
Vue
<form @submit.prevent="submitForm">
  <input v-model="formData.name" placeholder="Name" />
  <button type="submit">Send</button>
</form>
Sends form data as JSON and logs the server reply.
Vue
async function submitForm() {
  const response = await fetch('/api/send', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(formData.value)
  })
  const result = await response.json()
  console.log(result.message)
}
Sample Program

This Vue component shows a simple contact form. When submitted, it sends the data with a POST request. It shows messages about the sending status. The form uses accessible labels and live region for updates.

Vue
<template>
  <main>
    <h1>Contact Us</h1>
    <form @submit.prevent="submitForm" aria-label="Contact form">
      <label for="name">Name:</label>
      <input id="name" v-model="formData.name" required aria-required="true" />

      <label for="email">Email:</label>
      <input id="email" type="email" v-model="formData.email" required aria-required="true" />

      <button type="submit">Submit</button>
    </form>
    <p role="status" aria-live="polite">{{ message }}</p>
  </main>
</template>

<script setup>
import { ref } from 'vue'

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

async function submitForm() {
  message.value = 'Sending...'
  try {
    const response = await fetch('https://jsonplaceholder.typicode.com/posts', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(formData.value)
    })
    if (response.ok) {
      message.value = 'Form submitted successfully!'
      formData.value = { name: '', email: '' }
    } else {
      message.value = 'Failed to submit form.'
    }
  } catch {
    message.value = 'Error sending form.'
  }
}
</script>
OutputSuccess
Important Notes

Always handle errors to inform users if the submission fails.

Use aria-label and aria-live for better accessibility.

Reset form fields after successful submission to clear inputs.

Summary

POST requests send form data safely to servers.

Use Vue's @submit.prevent to control form submission.

Show clear messages to users about submission status.

Practice

(1/5)
1. In Vue, which directive is used to prevent the default form submission and handle it with a method instead?
easy
A. @input.prevent
B. @click.prevent
C. v-model.prevent
D. @submit.prevent

Solution

  1. Step 1: Understand Vue event modifiers

    Vue provides event modifiers like .prevent to stop default browser actions.
  2. Step 2: Identify the correct event for form submission

    The form submission event is submit, so @submit.prevent stops the default submit and allows custom handling.
  3. Final Answer:

    @submit.prevent -> Option D
  4. Quick Check:

    Use @submit.prevent to control form submit [OK]
Hint: Use @submit.prevent to stop default form submit [OK]
Common Mistakes:
  • Using @click.prevent on form instead of @submit.prevent
  • Trying to use v-model.prevent which doesn't exist
  • Using @input.prevent which is for input events
2. Which of the following is the correct way to send a POST request with form data using Vue's fetch API inside a method?
easy
A. fetch('/api', { method: 'POST', body: JSON.stringify(data) })
B. fetch('/api', { method: 'GET', body: JSON.stringify(data) })
C. fetch('/api', { method: 'POST', data: data })
D. fetch('/api', { method: 'POST', body: data })

Solution

  1. Step 1: Identify the correct HTTP method for sending data

    POST is used to send data to the server, so method must be 'POST'.
  2. Step 2: Use the correct property for sending JSON data

    fetch expects the data in the body property as a string, so use JSON.stringify(data).
  3. Final Answer:

    fetch('/api', { method: 'POST', body: JSON.stringify(data) }) -> Option A
  4. Quick Check:

    POST with JSON.stringify in body = fetch('/api', { method: 'POST', body: JSON.stringify(data) }) [OK]
Hint: Use method POST and JSON.stringify(data) in body [OK]
Common Mistakes:
  • Using method GET when sending data
  • Passing data directly without JSON.stringify
  • Using 'data' property instead of 'body'
3. Given this Vue method for form submission, what will be logged if the server responds with status 200?
async submitForm() {
  const response = await fetch('/submit', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(this.formData)
  });
  if (response.ok) {
    console.log('Success');
  } else {
    console.log('Failed');
  }
}
medium
A. Failed
B. Success
C. SyntaxError
D. No output

Solution

  1. Step 1: Understand fetch response status

    When the server responds with status 200, response.ok is true.
  2. Step 2: Check the conditional logging

    If response.ok is true, it logs 'Success'. Otherwise, it logs 'Failed'.
  3. Final Answer:

    Success -> Option B
  4. Quick Check:

    response.ok true means 'Success' logged [OK]
Hint: response.ok true means success message logs [OK]
Common Mistakes:
  • Confusing response.ok with response.status
  • Expecting 'Failed' on status 200
  • Missing await causing no output
4. What is wrong with this Vue method for submitting a form?
submit() {
  fetch('/api', {
    method: 'POST',
    body: this.formData
  })
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.log(error));
}
medium
A. Missing JSON.stringify for body data
B. Missing method property in fetch options
C. Using async/await incorrectly
D. No catch block for errors

Solution

  1. Step 1: Check how formData is sent in fetch

    fetch expects the body to be a string for JSON data, so this.formData must be stringified.
  2. Step 2: Identify missing JSON.stringify

    Without JSON.stringify(this.formData), the server may not receive data correctly.
  3. Final Answer:

    Missing JSON.stringify for body data -> Option A
  4. Quick Check:

    Body must be JSON string, not raw object [OK]
Hint: Always stringify JSON data before sending in fetch body [OK]
Common Mistakes:
  • Sending raw object instead of JSON string
  • Forgetting method: 'POST' (not the case here)
  • Not handling errors with catch
5. You want to submit a form in Vue and show a success message only if the POST request returns JSON with { success: true }. Which code snippet correctly implements this?
hard
A. async submit() { const res = await fetch('/submit', { method: 'POST', body: JSON.stringify(this.form) }); const data = await res.json(); if (data.success) alert('Submitted!'); }
B. async submit() { const res = await fetch('/submit', { method: 'POST', body: this.form }); const data = await res.json(); if (data.success) alert('Submitted!'); }
C. submit() { fetch('/submit', { method: 'POST', body: JSON.stringify(this.form) }) .then(res => res.json()) .then(data => { if (data.success) alert('Submitted!'); }); }
D. submit() { fetch('/submit', { method: 'POST', body: this.form }) .then(res => res.json()) .then(data => { if (data.success) alert('Submitted!'); }); }

Solution

  1. Step 1: Check correct JSON stringification

    Options A and C stringify the form data correctly; B and D do not.
  2. Step 2: Identify correct async handling

    submit() {
      fetch('/submit', { method: 'POST', body: JSON.stringify(this.form) })
        .then(res => res.json())
        .then(data => { if (data.success) alert('Submitted!'); });
    }
    uses promise chaining correctly without async/await, which is valid.
    async submit() {
      const res = await fetch('/submit', { method: 'POST', body: JSON.stringify(this.form) });
      const data = await res.json();
      if (data.success) alert('Submitted!');
    }
    uses async/await but misses headers for JSON content.
  3. Step 3: Consider headers for JSON content

    submit() {
      fetch('/submit', { method: 'POST', body: JSON.stringify(this.form) })
        .then(res => res.json())
        .then(data => { if (data.success) alert('Submitted!'); });
    }
    is the best because it correctly stringifies and processes JSON response; headers are optional but recommended.
  4. Final Answer:

    Option C correctly submits and checks JSON success -> Option C
  5. Quick Check:

    Stringify data and check JSON success in then() [OK]
Hint: Stringify form data and check JSON success in then() [OK]
Common Mistakes:
  • Not stringifying form data before sending
  • Missing headers for JSON content-type
  • Mixing async/await and then() incorrectly
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard