# Vue compatibility Docsify allows [Vue.js](https://vuejs.org) content to be added directly to your markdown pages. This can greatly simplify working with data and adding reactivity to your site. Vue [template syntax](https://vuejs.org/guide/essentials/template-syntax) can be used to add dynamic content to your pages. Vue content becomes more interesting when [data](#data), [computed properties](#computed-properties), [methods](#methods), and [lifecycle hooks](#lifecycle-hooks) are used. These options can be specified as [global options](#global-options) or within DOM [mounts](#mounts) and [components](#components). ## Setup To get started, add Vue.js to your `index.html` file. Choose the production version for your live site or the development version for helpful console warnings and [Vue.js devtools](https://github.com/vuejs/vue-devtools) support. ```html ``` ## Template syntax Vue [template syntax](https://vuejs.org/guide/essentials/template-syntax) offers several useful features like support for [JavaScript expressions](https://vuejs.org/guide/essentials/template-syntax.html#using-javascript-expressions) and Vue [directives](https://vuejs.org/guide/essentials/template-syntax.html#directives) for loops and conditional rendering. ```markdown

Text for GitHub

2 + 2 = {{ 2 + 2 }}

```

Text for GitHub

2 + 2 = {{ 2 + 2 }}

[View output on GitHub](https://github.com/docsifyjs/docsify/blob/develop/docs/vue.md#template-syntax) ## Code Blocks Docsify ignores Vue template syntax within code blocks by default: ````markdown ``` {{ message}} ``` ```` To process Vue template syntax within a code block, wrap the code block in an element with a `v-template` attribute: ````markdown
``` {{ message}} ```
```` ## Data ```js { data() { return { message: 'Hello, World!' }; } } ``` ```markdown {{ message }}

```

{{ message }}

[View output on GitHub](https://github.com/docsifyjs/docsify/blob/develop/docs/vue.md#data) ## Computed properties ```js { computed: { timeOfDay() { const date = new Date(); const hours = date.getHours(); if (hours < 12) { return 'morning'; } else if (hours < 18) { return 'afternoon'; } else { return 'evening' } } }, } ``` ```markdown Good {{ timeOfDay }}! ``` Good {{ timeOfDay }}! ## Methods ```js { data() { return { message: 'Hello, World!' }; }, methods: { hello() { alert(this.message); } }, } ``` ```markdown ```

## Lifecycle Hooks ```js { data() { return { images: null, }; }, created() { fetch('https://api.domain.com/') .then(response => response.json()) .then(data => (this.images = data)) .catch(err => console.log(err)); } } // API response: // [ // { title: 'Image 1', url: 'https://domain.com/1.jpg' }, // { title: 'Image 2', url: 'https://domain.com/2.jpg' }, // { title: 'Image 3', url: 'https://domain.com/3.jpg' }, // ]; ``` ```markdown
{{ image.title }}
```
{{ image.title }}
## Global options Use `vueGlobalOptions` to specify global Vue options for use with Vue content not explicitly mounted with [vueMounts](#mounts), [vueComponents](#components), or a [markdown script](#markdown-script). Changes to global `data` will persist and be reflected anywhere global references are used. ```js window.$docsify = { vueGlobalOptions: { data() { return { count: 0, }; }, }, }; ``` ```markdown

{{ count }}

```

{{ count }}

Notice the behavior when multiple global counters are rendered:

{{ count }}

Changes made to one counter affect the both counters. This is because both instances reference the same global `count` value. Now, navigate to a new page and return to this section to see how changes made to global data persist between page loads. ## Mounts Use `vueMounts` to specify DOM elements to mount as Vue instances and their associated options. Mount elements are specified using a [CSS selector](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Selectors) as the key with an object containing Vue options as their value. Docsify will mount the first matching element in the main content area each time a new page is loaded. Mount element `data` is unique for each instance and will not persist as users navigate the site. ```js window.$docsify = { vueMounts: { '#counter': { data() { return { count: 0, }; }, }, }, }; ``` ```markdown
{{ count }}
``` {{ count }} ## Components Use `vueComponents` to create and register global [Vue components](https://vuejs.org/guide/essentials/component-basics.html). Components are specified using the component name as the key with an object containing Vue options as the value. Component `data` is unique for each instance and will not persist as users navigate the site. ```js window.$docsify = { vueComponents: { 'button-counter': { template: ` `, data() { return { count: 0, }; }, }, }, }; ``` ```markdown ``` ## Markdown script Vue content can mounted using a ` ``` ## Technical Notes - Docsify processes Vue content in the following order on each page load: 1. Execute markdown `