# Vue compatibility Docsify allows Vue content to be added directly to your markdown pages. This can greatly simplify working with data and adding reactivity to your site. To get started, add Vue [2.x](https://vuejs.org) or [3.x](https://v3.vuejs.org) 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. #### Vue 2.x ```html ``` #### Vue 3.x ```html ``` ## Template syntax Vue [template syntax](https://vuejs.org/v2/guide/syntax.html) is used to create dynamic content. With no additional configuration, this syntax offers several useful features like support for [JavaScript expressions](https://vuejs.org/v2/guide/syntax.html#Using-JavaScript-Expressions) and Vue [directives](https://vuejs.org/v2/guide/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) 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). ### Data ```js { data() { return { message: 'Hello, World!' }; } } ``` ```markdown {{ message }}

Text for GitHub

``` {{ message }}

Text for GitHub

[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 [Vue options](https://vuejs.org/v2/api/#Options-Data) 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](https://vuejs.org/v2/guide/instance.html) 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/v2/guide/components.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 ` ``` ```html ``` ## Technical Notes - Docsify processes Vue content in the following order on each page load: 1. Execute markdown `