Electron is an app framework to let us build desktop apps that are based on web apps.
Vuetify lets us build a web app with Material Design.
We can use the vue-cli-plugin-electron-builder generator to build an Electron app based on Vue.js.
In this article, we’ll look at how to build a simple Electron Vue app with Vuetify and Electron.
Getting Started
We can create our Vue project by running:
npx vue create .
after going into our project folder.
We follow the instructions to create the Vue project.
Then in the project folder, we run:
vue add electron-builder
Once we did that, we add Vuetify to our Vue app by running:
vue add vuetify
Now all the boilerplate code has been added for us.
We then run:
npm run electron:serve
or
yarn electron:serve
to preview our app.
Writing the Code
Now can create our app with Vuetify.
We can create a simple app by adding the following to App.vue :
<template>
  <v-app>
    <v-app-bar app color="primary" dark>
      <div class="d-flex align-center">
        <v-img
          alt="Vuetify Logo"
          class="shrink mr-2"
          contain
          src="https://cdn.vuetifyjs.com/images/logos/vuetify-logo-dark.png"
          transition="scale-transition"
          width="40"
        />
    <span class="mr-2">App</span>
      </div>
    </v-app-bar>
    <v-main>
      <v-form v-model="valid" @submit.prevent="add">
        <v-container>
          <v-row>
            <v-col cols="12" md="6">
              <v-text-field v-model="title" :rules="rule" label="book title" required></v-text-field>
            </v-col>
            <v-col cols="12" md="6">
              <v-text-field v-model="author" :rules="rule" label="book author" required></v-text-field>
            </v-col>
          </v-row>
          <v-row>
            <v-col cols="12">
              <v-btn text type="submit" color="primary">add</v-btn>
            </v-col>
          </v-row>
        </v-container>
      </v-form>
      <v-simple-table>
        <template v-slot:default>
          <thead>
            <tr>
              <th class="text-left">title</th>
              <th class="text-left">author</th>
              <th></th>
            </tr>
          </thead>
          <tbody>
            <tr v-for="(b, i) in books" :key="b.id">
              <td>{{ b.title }}</td>
              <td>{{ b.author }}</td>
              <td>
                <v-btn text color="primary" @click="remove(i)">remove</v-btn>
              </td>
            </tr>
          </tbody>
        </template>
      </v-simple-table>
    </v-main>
  </v-app>
</template>
<script>
import { v4 as uuidv4 } from "uuid";
export default {
  name: "App",
  data: () => ({
    title: "",
    author: "",
    rule: [(v) => !!v || "required"],
    valid: false,
    books: [],
  }),
  methods: {
    add() {
      if (!this.valid) {
        return;
      }
      const { title, author } = this;
      this.books.push({
        id: uuidv4(),
        title,
        author,
      });
    },
    remove(index) {
      this.books.splice(index, 1);
    },
  },
};
</script>
We created a book app with a form and a table.
v-app-bar is the top app bar.
v-main has the main content of the app.
v-form creates the form.
The v-model attribute on the form has the form validation state.
The @submit.prevent directive listens for the submit event to be emitted.
prevent calls preventDefault implicitly.
Inside the form, we have the v-text-field to add the text field.
v-model binds to the model states.
The rules prop has the form validation rules.
The rules are defined with an array of functions with the inputted value as the parameter.
The table is created with the v-simple-table component.
And we populate the default slot with the regular table elements.
In the methods object, we have the add method to let us add entries to this.books .
We check for form data validity with the this.valid property.
A unique ID is generated for each entry with the uuid package.
We need a unique ID for the key prop in the table so the items are rendered correctly.
We install that by running:
npm i uuid
Also, we have the remove method to remove items by its index.
Now we should be able to add and remove items as we wish.
Build Our App
To build our app into an executable file, we run:
yarn electron:build
with Yarn or:
npm run electron:build
with NPM.
Conclusion
We can create our a good looking Vue desktop app with Vuetify, Vue, and the vue-cli-plugin-electron-builder code generator.
