January 22, 2020

Introduction to Vue

By John Au-Yeung | 7 min read

Introduction to Vue

What is Vue.js?

Vue is a progressive front end framework that can be added easily to an existing app. We can also make a single page app from it. This means that we can use it to add new functionality to existing apps or to use it to create new apps.

It's a component-based framework, which means that we build apps with Vue by nesting components and passing data in between them.

Getting Started

We can get started by creating a script tag to add the Vue.js framework to our code.

There's a development version of the framework which we can add by writing:

<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

The development version isn't minified, so it shouldn't be used in production.

The production version can be added by writing:

<script src="https://cdn.jsdelivr.net/npm/vue"></script>

Creating our First Vue App

We can begin by creating a project folder and then adding an index.html and an index.js file to hold our HTML and JavaScript code respectively.

Then, in index.js we have to create a new Vue instance, which is an entry point of our Vue app.

To do this, we can write the following code in index.js:

new Vue({
  el: "#app",
  data: {
    message: "Hello"
  }
});

In the code above, we create a new instance Vue by passing in an object with various options.

The el property tells Vue to put our app inside a div element with ID app.

The data property has the initial data which we can use in templates.

Then, in index.html, we write the following code:

<!DOCTYPE html>
<html lang="en">
  <head>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <title>App</title>
  </head>
  <body>
    <div id="app">
      {{message}}
    </div>
    <script src="index.js"></script>
  </body>
</html>

The HTML code above has the script tags for the Vue framework located at the top, and another script tag for our own code located at the bottom.

In the div element with ID app, we added the double curly braces to display the string 'hello' from data.message in index.js.

The automatic updating of the template's data from the Vue instance is called data binding.

Data can also go from the template back to the Vue instance as we will see later.

At this point, we should see:

Hello

on the screen when we load the browser.

In Vue.js, any valid JavaScript expression can be placed in between the double curly braces.

Some examples of this are:

{{ num + 1 }}

or:

{{ messages.reverse() }}

Conditional Rendering

We can conditionally render items on the screen by using the v-if directive. Directives are Vue code that we can apply to make an element do something.

For example, we can write the following code:

index.js:

new Vue({
  el: "#app",
  data: {
    message: "Hello"
  }
});

index.html:

<p v-if="Math.random() > 0.5">
  {{message}}
</p>
<p v-else>
  No Message
</p>

Then, when we load the browser or refresh it, we see that 'Hello' will be displayed sometimes, since it's only displayed when Math.random() returns something bigger than 0.5.

The v-else directive is for displaying something if the condition in v-if is false. In the code above, if Math.random() returns some number less than 0.5, then we'll see “No Message”.

Protect your Vue App with Jscrambler

Accepting Inputs

A Vue app can take inputs via the v-model directive. This directive accepts a variable as the value.

v-model gets the input and sets it to the data in the Vue instance. It'll also get the data from the Vue instance and display it on the template. We call this 2-way binding since the data is automatically set and data already set is also passed back to the template.

For example, if we have the following code:

index.js:

new Vue({
  el: "#app",
  data: {
    message: "Hello"
  }
});
<input v-model="message" />
<p>{{message}}</p>

When the page first loads, we see the word 'Hello' inside the input element. This happens because the value of data.message is sent from the Vue instance to the input by the v-model directive.

Then, when we type in something in the input, it'll be displayed in the p element below it. This is because the data typed into the input element is sent to the Vue instance that we created in index.js

The data we typed in is set in data.message in the object that we passed into new Vue.

Handling Events

JavaScript events have to be handled so that the app can properly react when the user performs an action.

Vue makes this easy by providing the v-on directive. @ is shorthand for v-on. For example, v-on:click is the same as @click. To handle user click events, we can use the v-on:click="onClick". This calls the onClick method in the object that we passed into the Vue instance when the user clicks whatever has this directive applied.

The click in v-on:click is called an argument. This is because we can replace click with other event names that we define or are built into the browser.

Using this knowledge, we can create a button that pops up a message as follows:

index.js:

new Vue({
  el: "#app",
  methods: {
    onClick() {
      alert("Hello");
    }
  }
});
<div id="app">
    <button v-on:click="onClick">Click Me</button>
</div>

When we click the Click Me button, our code calls the onClick method because we have v-on:click="onClick" in the template. Anything in the object can be called from the template.

Therefore, we should see an alert box that says 'Hello' pop up when we click the Click Me button.

Displaying Collections of Data

We can display collections of data easily with the v-for directive. It works with arrays and objects.

For example, it enables us to display items from an array as a list as follows:

index.js:

new Vue({
  el: "#app",
  data: {
    persons: [{ name: "Mary" }, { name: "Phil" }, { name: "Jane" }]
  }
});

index.html:

<div id="app">
    <ul>
        <li v-for="person of persons">{{person.name}}</li>
    </ul>
</div>

The code v-for="person of persons" will loop through the data.persons array in index.js and display all the items by getting each entry's name property and then display the item in a li element. This is because we added v-for="person of persons" in a li element.

Also, v-for="person of persons" and v-for="person in persons" are the same.

In the end, we should see:

Mary
Phil
Jane

We can also use v-for to display the key-value pairs of an object as follows:

index.js:

new Vue({
  el: "#app",
  data: {
    obj: {
      foo: "a",
      bar: "b",
      baz: "c"
    }
  }
});

index.html:

<div id="app">
    <ul>
        <li v-for="(value, name) in obj">{{name}} - {{value}}</li>
    </ul>
</div>

The key-value pairs from data.obj are displayed in li elements:

So we get:

foo - a
bar - b
baz - c

Creating Components

Vue is useful because it lets us divide up our app into components.
To create a simple component, we can use the Vue.component method as follows:

index.js:

Vue.component("custom-input", {
  data() {
    return {
      message: "foo"
    };
  },
  methods: {
    submit() {
      alert(this.message);
    }
  },
  template: `
    <div>
      <input v-model='message'>
      <p>{{message}}</p>
    </div>
  `
});
new Vue({
  el: "#app"
});

index.html:

<div id="app">
    <custom-input></custom-input>
</div>

In the code above, we created a component that's available everywhere by calling the Vue.component method with the name of the component as the first argument.

The second argument is the options object for creating the component. It's slightly different from what we have in the object that we passed in to create the Vue instance.

The data property is a function instead of an object. This way, the state won't be exposed to the outside.

methods and template are the same as the ones we set in the object that we use to create the Vue instance.

In index.html, we reference our custom-input component by writing:

<div id="app">
  <custom-input></custom-input>
</div>

Note that we can only reference components inside the element that we render our Vue app in. In this case, it would be the div with ID app. We can also reference components in another component's template or recursively in its own template.

Conclusion

Vue is a component-based framework that we can use to create front-end apps in a clean and expressive way.

It has built-in directives for model binding, conditional rendering, and rendering list of items.

Hopefully, this tutorial has helped you quickly understand the basic aspects of Vue and motivated you to start building something unique.

Before deploying your commercial or enterprise Vue apps to production, make sure you are protecting their code against reverse-engineering, abuse, and tampering by following our tutorial.

John Au-YeungWeb developer. Experienced in JavaScript, React, Angular, Vue.js, and Node.js.
View All Posts

Subscribe to our weekly newsletter

Learn more about new security threats and technologies.

I agree to receive these emails and accept the Privacy Policy.