Mutations

vue-gql exposes a Mutation component that is very similar to the Query component but with few distinct differences:

  • The mutation component does not have a variables prop.
  • The mutation component does not run automatically, you have to explicitly call execute.
  • Cache policies do not apply to mutations as mutations represent real-time actions and will always use network-only policy.

The Mutation component is renderless by default, meaning it will not render any extra HTML other than its slot, but only when exactly one child is present, if multiple children exist inside its slot it will render a span.



 
 
 
 



 
 













<template>
  <div>
    <Mutation
      query="mutation { likePost (id: 123) { message } }"
      v-slot="{ data, execute }"
    >
      <div v-if="data">
        <p>{{ data.likePost.message }}</p>
      </div>
      <button @click="execute()">Submit</button>
    </Mutation>
  </div>
</template>

<script>
import { Mutation } from 'vue-gql`;

export default {
  components: {
    Mutation
  }
};
</script>

Passing Variables

Since the Mutation component does not accept variables you can pass them to the execute method instead:



 




 


<Mutation
  query="mutation Like ($id: ID!) { likePost (id: $id) { message } }"
  v-slot="{ data, execute }"
>
  <div v-if="data">
    <p>{{ data.likePost.message }}</p>
  </div>
  <button @click="execute({ id: 123 })">Submit</button>
</Mutation>

Usually you would wrap your forms with the Mutation component and handle submits by executing the mutation.

Slot Props

fetching

The Mutation slot props contain more useful information that you can use to build better experience for your users, for example you can use the fetching slot prop to display a loading indicator while the form submits.



 

 








<Mutation
  query="mutation { likePost (id: 123) { message } }"
  v-slot="{ data, execute, fetching }"
>
  <Loading v-if="fetching" />

  <div v-if="data">
    <p>{{ data.likePost.message }}</p>
  </div>

  <button @click="execute()" :disabled="fetching">Submit</button>
</Mutation>

done

The done slot prop is a boolean that indicates that the query has been completed.

errors

The errors slot prop contains all errors encountered when running the query.



 


 





<Mutation
  query="mutation { likePost (id: 123) { message } }"
  v-slot="{ data, errors, execute }"
>
  <!-- Your Custom component to handle error display -->
  <ErrorPage v-if="errors" :errors="errors" />


  <button @click="execute()"">Submit</button>
</Mutation>

execute

Like you previously saw, the execute slot prop is a function that executes the mutation, it accepts the variables object if specified, and unlike the same slot prop in the Query component it does not affect caching.



 





 



<Mutation
  query="mutation { likePost (id: 123) { message } }"
  v-slot="{ data, execute }"
>
  <div v-if="data">
    <ul>
      <li v-for="post in data.posts" :key="post.id">{{ post.title }}</li>
    </ul>
    <button @click="execute()">Submit</button>
  </div>
</Mutation>