The author selected Open Sourcing Mental Illness to receive a donation as part of the Write for DOnations program.
When debugging a Vue application, it is common to iterate on your code, making changes then restarting the server to see if they fixed the problem in your browser-rendered site. But moving between your source code and your browser can be a time-consuming process. To make debugging more efficient, you can use a browser extension like Vue.js Devtools. Vue.js Devtools is a browser extension for Chrome and Firefox and a stand-alone Electron app created by Guillaume Chau and Evan You of the Vue.js Core Team. It provides the developer with a visual representation of the inner workings of their Vue application so that you can inspect components, data, computed properties, and events from the browser, as well as Vuex actions, getters, and mutations.
With Devtools, you will be able to see exactly when an event is executed and what payload it has. In addition to events, you will also be able to see all of your components displayed in a DOM-like format where you can analyze component properties, such as data
, computed
properties, and props
.
In this tutorial, you will set up a sample Vue application, install Vue.js DevTools in your browser, then add new features to your app while testing them with the browser extension. This will serve as a first step to debugging your code with Vue.js Devtools.
14.16.0
or greater installed on your computer. To install this on macOS or Ubuntu 20.04, follow the steps in How To Install Node.js and Create a Local Development Environment on macOS or the Option 2 — Installing Node.js with Apt Using a NodeSource PPA section of How To Install Node.js on Ubuntu 20.04.In this step, you will put together a sample application that you can use in later steps to try out the Devtools browser extension. To get started, generate a new Vue application via the Vue CLI. To do this, open your terminal window and run the following command.
- vue create favorite-airports
When prompted with the setup options for your Vue app, select Manually select features
. Then select Choose Vue version
, Babel
, and Vuex
. Once selected, hit the RETURN
key and continue filling out the prompts as follows:
OutputVue CLI v4.5.15
? Please pick a preset: Manually select features
? Check the features needed for your project: Choose Vue version, Babel, Vuex
? Choose a version of Vue.js that you want to start the project with 3.x
? Where do you prefer placing config for Babel, ESLint, etc.? In dedicated config files
? Save this as a preset for future projects? No
Once the favorite-airports
project is created, open your terminal window and cd
into the favorite-airports
root folder. Once you’ve changed into the directory, create a new directory with the mkdir
command:
- mkdir src/data
In your text editor of choice, create and open an data/airports.js
file and add in the following:
export default [
{
name: 'Cincinnati/Northern Kentucky International Airport',
abbreviation: 'CVG',
city: 'Hebron',
state: 'KY',
},
{
name: 'Seattle-Tacoma International Airport',
abbreviation: 'SEA',
city: 'Seattle',
state: 'WA',
},
{
name: 'Minneapolis-Saint Paul International Airport',
abbreviation: 'MSP',
city: 'Bloomington',
state: 'MN',
},
{
name: 'Louis Armstrong New Orleans International Airport',
abbreviation: 'MSY',
city: 'New Orleans',
state: 'LA',
},
{
name: `Chicago O'hare International Airport`,
abbreviation: 'ORD',
city: 'Chicago',
state: 'IL',
},
{
name: `Miami International Airport`,
abbreviation: 'MIA',
city: 'Miami',
state: 'FL',
}
]
This is an array of objects consisting of a few airports in the United States. In this application, you are going to iterate through this data to generate cards consisting of the name
, abbreviation
, city
, and state
properties. You will use this data to explore events and dispatches in Vue.js Devtools.
Save the airports.js
file, then create a single-file component (SFC) with the name AirportCard.vue
. This file will live in the components
directory of your project, and will contain all the styles and logic for the airport card.
Create and open components/AirportCard.vue
in your text editor and add the following:
<template>
<div class="airport">
<p>{{ airport.abbreviation }}</p>
<p>{{ airport.name }}</p>
<p>{{ airport.city }}, {{ airport.state }}</p>
</div>
</template>
<script>
export default {
props: {
airport: {
type: Object,
required: true
}
}
}
</script>
<style scoped>
.airport {
border: 3px solid;
border-radius: .5rem;
padding: 1rem;
margin-bottom: 1rem;
}
.airport p:first-child {
font-weight: bold;
font-size: 2.5rem;
margin: 1rem 0;
}
.airport p:last-child {
font-style: italic;
font-size: .8rem;
}
</style>
You may notice that there is some CSS included in this code snippet. In the AirportCard.vue
component, the wrapper <div>
contains the class of airport
. This CSS adds some styling to the generated HTML by adding borders to give each airport the appearance of a “card”. The :first-child
and :last-child
are pseudo selectors that apply different styling to the first and last p
tags in the HTML inside the div
with the class of airport
. In addition to that, you may also notice that this component contains a prop, which in Vue.js is a way to pass data down from a parent component to a child component.
Save and exit from the file.
Before wrapping up the setup, replace the existing App.vue
component with the following code:
<template>
<div class="wrapper">
<div v-for="airport in airports" :key="airport.abbreviation">
<airport-card :airport="airport" />
</div>
</div>
</template>
<script>
import { ref } from 'vue'
import allAirports from '@/data/airports.js'
import AirportCard from '@/components/AirportCard.vue'
export default {
components: {
AirportCard
},
setup() {
const airports = ref(allAirports)
return { airports }
}
}
</script>
<style>
#app {
font-family: Avenir, Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
.wrapper {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-column-gap: 1rem;
max-width: 960px;
margin: 0 auto;
}
p,
h3 {
grid-column: span 3;
}
</style>
This code contains a v-for
loop that iterates through the airports.js
data and renders a series of AirportCard.vue
components with airport data passed in via the prop :airport
. Save this code and return to the command line.
With the project set up, run the local development server using the npm run serve
command in your terminal:
- npm run serve
This will start a server on your localhost
, usually at port 8080
. Open your web browser of choice and visit localhost:8080
to see the following:
Your example application is now successfully set up. Throughout this tutorial, you are going to use this application to explore the Devtools browser extension.
In the next step, you are going to install the Vue.js Devtools on Chromium and Firefox browsers.
Before using the Vue.js Devtools, you will first have to download the program to your computer. This step will focus on installing Devtools in either a Chromium-based browser or Firefox.
Note: Before you move on, it’s important to note that the example project that you set up in Step 1 is using Vue.js 3. This means, in order for you to use Vue.js Devtools with this newest version of Vue at the time of publishing this tutorial, you will need to install the Beta channel version of Vue.js Devtools.
If you are using a Chromium browser, you can download the Devtools as a Chrome extension. The more common Chromium browsers are Google Chrome, Microsoft Edge, and Opera. If you are using other browsers such as Brave or Vivaldi, this step will work as well.
To install, first visit the Chrome Web Store. In the search bar in the top-left, search for “Vue Devtools”. You will find a number of results, as shown in the following image:
Make sure you only install Devtools that are offered by Vue.js or “vuejs-dev”, since these are maintained by the official team and are the most trusted solutions. Since you’re app is using Vue 3, you must download the Beta channel offered by “vuejs-dev”.
Once you click on that, you can view additional information about this extension, including screenshots and an overview, as shown in the following image:
When you are ready, click on the Add to Chrome button in the top-right of the browser. Your browser will then download and install the extension.
If you are using Mozilla Firefox, visit the Firefox Extension Store. In the top-right of your browser you will see a search bar. In it, search for “Vue Devtools”, as shown in the following image:
This will show a number of search results, including an entry published by Evan You:
Click on the extension that is from “Evan You”. From here, you can view additional information about the extension, including screenshots and an overview:
Click on the Add to Firefox button to download the extension and install it into your browser.
Note: If you are using an unsupported browser, such as Safari for example, you can still use Vue.js Devtools as a standalone Electron application via npm. Vue’s DevTool documentation has a page about installing the Devtools as a standalone app to debug an application locally or remotely.
You now have the Devtools extension installed to your browser. You will see the Vue.js logo where your pinned extensions show up in your browser bar. By default, this logo will be grayed out. But if you visit an application or website that is using Vue, that logo will become colorized with the Vue logo colors.
In this section, you successfully installed the Devtools on your Chromium or Firefox browser. In the next section, you are going to take a dive into the user interface of the application to view the properties of your AirportCard
components from the browser.
Next, you will navigate through the Devtools interface to inspect the properties of the components in your sample application.
In Step 1, you started your project on a local development server at localhost:8080
. Navigate to that URL in your browser, then right-click or use CMD+ALT+I
on a Mac or CTRL+ALT+I
in Windows to open your browser inspection tools. In the top bar of your inspector window, there will be a new tab titled Vue. Click on that tab and the Devtools will initialize:
Vue.js Devtools initially has two sections: a listing view and a detail view. The listing view contains a list of Vue components or Vuex namespaces. When the Devtools start up, you will see a list of components on the left. Since there are a total of six airport cards displayed in your sample application, there will be six AirportCard
components displayed in the listing view, along with the App
component.
In the listing view, select the first App
component. The detail view will now provided extra detail about that component. In this case, you will find all of the data
and computed
properties associated with App.vue
, which in this case includes setup
with an array of objects representing the airports in airports.js
.
Now click on the first AirportCard
directly under App
. You will find all of the data
and computed
properties associated with that instance of the AirportCard.vue
component. In this case, it is the CVG
card, so it will show properties like abbreviation: "CVG"
and state: KY
. When hovering over this component, Devtools will also highlight the rendered component in your browser:
This section showed some basic navigation of the Devtools interface, allowing you to check the properties of components generated in your Vue app. In the next step, you are going to make some changes to the Vue application via the Devtools. With these small edits, you will see how Devtools can be used to test changes to your components.
With Vue.js Devtools, you can change the properties of your components from the browser, without needing to change your source code. This allows you to debug your application more quickly, without having to adjust your actual code. In this step, you will try this capability out by adding some conditional styling to your AirportCard
components and testing it in the browser.
Currently in your application, there are six different airports. You are going to add some code that will change the color of the card if the airport is under construction. To do this, you will need to navigate to the AirportCard.vue
component. You could navigate to it manually, or you can leverage Vue.js Devtools to open this file in your text editor of choice.
In the browser, with the Devtools window open, click on the crosshairs in the top-right of the development tool. When that is clicked, you can hover over the various airport cards. Devtools will highlight the component in a green color, indicating that the component is selected. When highlighted, click on the card:
Now that you have your component selected, click on the icon in the top-right that looks like a square with a diagonal arrow. This icon is typically used to notify the user that something will be opened outside of the application. Clicking this will open AirportCard.vue
in your editor. With your component file opened, go ahead and add the following highlighted code:
<template>
<div class="airport">
<p>{{ airport.abbreviation }}</p>
<p>{{ airport.name }}</p>
<p>{{ airport.city }}, {{ airport.state }}, Under Construction? {{ airport.construction }}</p>
</div>
</template>
...
This will render the data within the construction
property of the airport object. With that complete, add data to the src/data/airports.js
file to show if an airport is under construction or not:
export default [
{
name: 'Cincinnati/Northern Kentucky International Airport',
...
construction: false
},
{
name: 'Seattle-Tacoma International Airport',
...
construction: false
},
{
name: 'Minneapolis-Saint Paul International Airport',
...
construction: false
},
{
name: 'Louis Armstrong New Orleans International Airport',
...
construction: false
},
{
name: `Chicago O'hare International Airport`,
...
construction: false
},
{
name: `Miami International Airport`,
...
construction: false
}
]
Save and close this data file.
With your data added to your application, you will now write some CSS to add a class if the construction
property is true
. Open the AirportCards.vue
component to add the following:
<template>
<div class="airport" :class="{ 'is-under-construction': airport.construction }">
<p>{{ airport.abbreviation }}</p>
<p>{{ airport.name }}</p>
<p>{{ airport.city }}, {{ airport.state }}, Under Construction? {{ airport.construction }}</p>
</div>
</template>
<style scoped>
...
.airport.is-under-construction {
border-color: red;
color: red;
}
</style>
On the <div>
with the airport
class, you are binding an object to the class
attribute. The key of this object is the class that will be applied, and the property is the condition that needs to be met before applying the class. The CSS in the <style>
tags changes the border and the text color of the card to red if the class is-under-construction
is applied to the card.
Now open your browser and open the Vue.js Devtools. In the left pane, highlight the <App>
component. On the right column, the setup
method and its properties will be displayed. You will find an array of airports
. Expand that array, then expand one of the objects in it. Open the first object with the abbreviation CVG
. To test if this code works, click on the pencil icon of the construction
data property and change it to true
.
Once you press ENTER
or click on the save icon, that data will be updated in the frontend. The card will immediately change to red. If you were to inspect the element and review the DOM, you would find that the is-under-construction
class has been applied to the first airport card.
Now that you’ve tried out changing properties in Devtools to test your application logic, you will next see how to test emitted events from the browser.
In addition to debugging a component’s data and properties, you can also use Devtools to debug built-in and custom events. Vue.js Devtools provides tools for visualizing events and their payloads.
To try out testing an event, you will first add an event to your AirportCard
component. When you click on an airport card, the app will emit an event to the parent component (App.vue
) with the airport data that you clicked.
Open your text editor, and in the AirportCard.vue
component, add the following click
event with an $emit
on the outermost <div>
:
<template>
<div class="airport" :class="{ 'is-under-construction': airport.construction }" @click="$emit('favorite-airport', airport)">
<p>{{ airport.abbreviation }}</p>
<p>{{ airport.name }}</p>
<p>{{ airport.city }}, {{ airport.state }}, Under Construction? {{ airport.construction }}</p>
</div>
</template>
...
On the outermost <div>
, you are invoking a JavaScript click
event. In that click
event, you are firing off a custom event called favorite-airport
. The payload for that event is the data associated with the airport
variable from the v-for
loop.
Save the changes to your AirportCard
component.
Next, open up Vue.js Devtools in your browser. In the top bar to the right of the compass icon (inspector) is the timeline inspector. Click on the icon to open up the Devtools timeline:
This timeline inspector lets you inspect any event, keyboard stroke, mutation, and more that happens over a period of time. With the tools open, click on one of the airport cards in the browser viewport. Once you do that, you will see a series of dots on your timeline:
These dots represent various events that happen behind the scenes, including the mousedown
and mouseup
events that were executed on your click. Mouse events will always be highlighted in purple. The green dot is your custom event that you set up to fire on the click
event. Click on the green dot to find more information regarding that event, as shown in the following image:
In this pane, you can see when the event was executed, as well as the data that was passed up to the parent. In this case, the payload of the event was the Chicago airport with the code ORD
. This shows that your event fired correctly, allowing you to continue to use this event to develop additional features. In the next step, you will use this event to store the payload data in a Vuex store to keep track of a user’s favorite airports.
In Vue.js Devtools, there is a specific pane set aside for monitoring Vuex actions, mutations, and stored state. By using this view, you can inspect your state for problems without having to iterate through source code changes. In this section, you will implement Vuex to make a list of favorite airports that a user can add to by clicking the airport card. You will then monitor these features with Vue.js Devtools.
With your custom event created and executing, you will now take that data and call a Vuex action and mutation with it. If you are not familiar with Vuex, it is recommended to read more about it in our Vuex tutorial.
In your text editor, open the src/store/index.js
file and add the following code:
import { createStore } from 'vuex'
export default createStore({
state: {
favorites: [],
},
mutations: {
UPDATE_FAVORITES(state, payload) {
state.favorites = payload
}
},
actions: {
addToFavorites({ state, commit }, payload) {
const airports = state.favorites
airports.push(payload)
commit('UPDATE_FAVORITES', airports)
}
}
})
In this snippet, you are adding to the index.js
file that was generated in Step 1. Specifically, you are adding a favorites
state property (an array of airports.js
objects), a mutation
called UPDATE_FAVORITES
, and an action
called addToFavorites
. The intent is for the user to click on a card, which will fire the action, which will fire the mutation, which will then update the store.
In your App.vue
component, add the following code to dispatch an action
when your custom favorite-airport
event is executed:
<template>
<div class="wrapper">
<div v-for="airport in airports" :key="airport.abbreviation">
<airport-card :airport="airport" @favorite-airport="$store.dispatch('addToFavorites', $event)"/>
</div>
</div>
</template>
<script>
import { ref } from 'vue'
import allAirports from '@/data/airports.js'
import AirportCard from '@/components/AirportCard.vue'
export default {
components: {
AirportCard
},
setup() {
const airports = ref(allAirports)
return { airports }
}
}
</script>
...
With your Vuex properties added, open your browser and open the Devtools. In the Components dropdown at the top of the pane, you will now find a Vuex option. Click to switch to the Vuex view.
Similar to the Components section, the left panel is a visualization of your state tree, complete with namespaced modules and any root state that you might have. To the right is a full list of data in that module or section of your Vuex state.
In the right panel, you will find an empty array of favorites
. Now click on a few cards and see each airport object get pushed into that array:
Now that you know that the state is working, you can expand on this by adding an additional section to the App.vue
file:
<div class="wrapper">
<div v-for="airport in airports" :key="airport.abbreviation">
<airport-card :airport="airport" @favorite-airport="$store.dispatch('addToFavorites', $event)"/>
</div>
<div v-if="$store.state.favorites.length">
<h1>Favorites <template v-if="$store.state.favorites.length">({{ $store.state.favorites.length }})</template></h1>
<div v-for="airport in $store.state.favorites" :key="airport.abbreviation">
<airport-card :airport="airport" />
</div>
</div>
</div>
...
Save the file, then click on a card in your browser. A new section will be displayed with cards of the airports that have been added.
Vue.js Devtools is a free browser extension that you can add to any Chromium or Firefox broswer. You can also download it and as a standalone application that can be tied to your application. In this tutorial, you built an application from a dataset that rendered a number of card components, each with their own data. You then used Devtools to examine the properties of the components, change properties to test conditional style changes, test to see if events fired appropriately, and ensured that Vuex state management was set up correctly.
To learn more about Vue.js Devtools, you can visit the official Vue DevTools documentation. For more tutorials on Vue, check out the How To Develop Websites with Vue.js series page.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This series provides a starting point for building websites with the front-end JavaScript framework Vue.js. Created in 2014 by Evan You (formally of Google), Vue.js is often described as a combination of React and Angular, borrowing the prop-driven development of React and the templating power of Angular. By the end of this series, you will have the tools to develop websites that focus on traditional HTML and CSS, while still taking advantage of the robustness and scalability of a front-end framework.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Thank you for writing this series. I learned a lot from it.