Vue.js Components
Tags: javascript, vue
Published: 2018-06-19 15:51:19

---
title: Vue.js Components
published: true
tags: javascript, vue
canonical_url: https://flaviocopes.com/vue-components/
---

Components are single, independent units of an interface. They can have their own state, markup and style.

## How to use components

Vue components can be defined in 4 main ways.

Let’s talk in code.

The first is:

```
new Vue({ /* options */ })

```

The second is:

```
Vue.component('component-name', { /* options */ })

```

The third is by using local components: components that only accessible by a specific component, and not available elsewhere (great for encapsulation).

The fourth is in `.vue` files, also called [Single File Components](https://dev.to/flaviocopes/vuejs-single-file-components-33jp-temp-slug-8476893).

Let’s dive into the first 3 ways in details.

Using `new Vue()` or `Vue.component()` is the standard way to use Vue when you’re building an application that is not a Single Page Application (SPA), but rather uses Vue.js just in some pages, like in a contact form or in the shopping cart. Or maybe Vue is used in all pages, but the server is rendering the layout, and you serve the HTML to the client, which then loads the Vue application you build.

In a SPA, where it’s Vue that builds the HTML, it’s more common to use Single File Components as they are more convenient.

You instantiate Vue by mounting it on a DOM element. If you have a `<div id="app"></div>` tag, you will use:

```
new Vue({ el: '#app' })

```

A component initialized with `new Vue` has no corresponding tag name, so it’s usually the main container component.

Other components used in the application are initialized using `Vue.component()`. Such a component allows you to define a tag, with which you can embed the component multiple times in the application, and specify the output of the component in the `template` property:

```
<div id="app">
  <user-name name="Flavio"></user-name>
</div>


Vue.component('user-name', {
  props: ['name'],
  template: '<p>Hi {{ name }}</p>'
})

new Vue({
  el: "#app"
})

```

* * *
<script async src="//jsfiddle.net/flaviocopes/nvgedhq4/embed/js,html,result/"></script>
* * *

What are we doing? We are initializing a Vue root component on `#app`, and inside that we use the Vue component `user-name`, which abstracts our greeting to the user.

The component accepts a prop, which is an attribute we use to pass data down to child components.

In the `Vue.component()` call we passed `user-name` as the first parameter. This gives the component a name. You can write the name in 2 ways here. The first is the one we used, called **kebab-case**. The second is called **PascalCase** , which is like camelCase, but with the first letter capitalized:

```
Vue.component('UserName', { /* ... */ })

```

Vue internally automatically creates an alias from `user-name` to `UserName`, and vice versa, so you can use whatever you like. It’s generally best to use `UserName` in the JavaScript, and `user-name` in the template.

## Local components

Any component created using `Vue.component()` is **globally registered**. You don’t need to assign it to a variable or pass it around to reuse it in your templates.

You can encapsulate components locally by assigning an object that defines the component object to a variable:

```
const Sidebar = {
  template: '<aside>Sidebar</aside>'
}

```

and then make it available inside another component by using the `components` property:

```
new Vue({
  el: '#app',
  components: {
    Sidebar
  }
})

```

You can write the component in the same file, but a great way to do this is to use JavaScript modules:

```
import Sidebar from './Sidebar'

export default {
  el: '#app',
  components: {
    Sidebar
  }
}

```

## Reusing a component

A child component can be added multiple times. Each separate instance is independent from the others:

```
<div id="app">
  <user-name name="Flavio"></user-name>
  <user-name name="Roger"></user-name>
  <user-name name="Syd"></user-name>
</div>


Vue.component('user-name', {
  props: ['name'],
  template: '<p>Hi {{ name }}</p>'
})

new Vue({
  el: "#app"
})

```

* * *
<script async src="//jsfiddle.net/flaviocopes/3kebv908/embed/js,html,result/"></script>
* * *

## The building blocks of a component

So far we’ve seen how a component can accept the `el`, `props` and `template` properties.

- `el` is only used in root components initialized using `new Vue({})`, and identifies the DOM element the component will mount on.
- `props` lists all the properties that we can pass down to a child component
- `template` is where we can set up the component template, which will be responsible for defining the output the component generates.

A component accepts other properties:

- `data` the component local state
- `methods`: the component [methods](https://dev.to/flaviocopes/vuejs-methods-4kn1-temp-slug-989840)
- `computed`: the [computed properties](https://dev.to/flaviocopes/vuejs-computed-properties-384m-temp-slug-5709303) associated with the component
- `watch`: the component [watchers](https://dev.to/flaviocopes/vuejs-watchers-3kd8-temp-slug-5427953)

> I'm working on a Vue.js course. If you're interested in learning Vue, [get on the list](https://flaviocopes.com/course/vue/) to get a free 100+ pages ebook about the Vue fundamentals next week!