Основы

Vue - знает только о том что находится внутри контейнера. И не может получить доступ ни к чему что нахогодится за его пределами.

Одна из особенностей vue.js - реактивность, т.е. если мы изменим данные внутри модели - это приведёт к обновлению шаблона.

Списки

Для построения списков используется v-for.

<li v-for="item in item_array">
	{{ item.name }}
</li>

Классы

Для применения класса к элементу используется v-bind:class="".

<li v-for="item in item_array" v-bind:class="{ 'user_class':item.status }">
	{{ item.name }}
</li>

Можно использовать более короткую запись :class="" вместо v-bind:class="".

События

Для обработки событий используется v-on: Для клика это будет v-on:click="onClick". Далее функция объявляется в Vue.

new Vue({
	el: "#app",
	methods: {
		onClick: function() {
			console.log('done')
		}
	}
})

Для того чтобы остановить выполнение события (например отправку формы) - нужно к директиве добавить модификатор prevent. Это будет аналогично preventDefault. Также можно использовать модификатор stop. Это будет аналогично stopPropagation.

<button v-on:click.prevent="onClick">Кнопка</button> 
<button v-on:click.stop="onClick">Кнопка</button> 

Также можно отслеживать - нажал ли пользователь определённую кнопку. Для этого используется директива v-on:keyup.enter. enter - это псевдоним кнопки. Вместо псевдонима можно использовать код кнопки - v-on:keyup.13. После указания кнопки - указывается метод который будет это обрабатывать - v-on:keyup.13="onClick".
Вместо v-on - можно воспользоваться шорткатом @.

<div id="app">
	<input type="text" v-model="message" @keyup.13="onClick">
</div>
<script>
	new Vue({
		el: "#app",
		data: {
			message: ''
		},
		methods: {
			onClick: function() {
				console.log(this.message)
			}
		}
	})
</script>

Toggle кнопки

Vue позволяет создавать простые toggle всего в 1 строку

<button @click="show = !show">
	<i class="ion-navicon"></i>
</button>
<script>
	new Vue({
		el: "#app",
		data: {
			show: false
		}
	})
</script>

Переходы - анимация

За отображение скрытие отвечает директива v-show. Чтобы полность уюрать элемент из DOOM дерева используется v-if. Директива v-else работает с v-show и с v-if

<aside v-show="show"></aside>
<aside v-if="show"></aside>

Анимация задаётся директовой transition="slide". Это значит что к элементу бкдет добавляться класс .slide-transition, который можно определить в css файле.

Для того чтобы анимация заработала - в Vue есть два класса которые позволяют указать что именно должно происходить с элементом. .slide-enter - добавляется к элементу перед отображением на странице. .slide-leave - добавляется к элементу перед скрытием.

<aside v-show="show" transition="slide"></aside>
<style> 
	.slide-transition {
		transition: all .3s cubic-bezier(.65, .05, .36, 1);
	}
	.slide-enter, .slide-leave {
		left: -100%;
	}
</style> 

Фильтры

Фильтры - это javascript функции которые обрабатывают данные и возвращают их в нужном виде.

{{ 'фильтры' | uppercase }}

Одним из полезных фильтров - является orderBy- предназначенный для сортировки. Этот фильтр используется совместно с директивой v-for.

<li v-for="item in array | orderBy 'name'">{{ item.name }}</li>

Фильтр filterBy - можно использовать для простейшего поиска.По умолчанию поиск идёт по всем полям.

<input type="text" v-model="query" />
<li v-for="item in array | filterBy query">{{ item.name }}</li>

Для фильтрации строго по выбранному полю нужно добавить поле по которому будет вестись поиск.

<li v-for="item in array | filterBy query in 'name'">{{ item.name }}</li>

Для создания собственного фильтра используется Vue.filter:

Vue.filter('emoji', function(value) {
	return value.replace('единорог', '&#129412;')
				.replace('щенок', '&#128054;')
})

Вычисляемые свойства

Вычисляемые свойства - это данные которые автоматически рассчитывают своё значение по мере обращения к ним из другого места программы. Важной особенностью вычисляемых свойств - является то что они кешируются и перерасчитывают своё значение только при изменении зависимостей. Для объявления вычисляемого свойства используется ключевое слово computed.

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
});

Компоненты

Компоненты - это переиспользуемые экземпляры Vue со своим именем. Является аналогом директив в Angular.

// Определяем новый компонент, названный button-counter
Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '<button v-on:click="count++">Счётчик кликов — {{ count }}</button>'
})

Сам шаблон можно определить и в html коде например так:

// Определяем новый компонент, названный button-counter
Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '#user_button'
})
<template id="dialog-template">
	<button v-on:click="count++">Счётчик кликов — {{ count }}</button>
</template>

Использование:

<div id="components-demo">
  <button-counter></button-counter>
</div>
new Vue({ el: '#components-demo' })

Динамические компоненты

Динамические компоненты - предназначены для создания подгружаемого контента. Особенностью является - сохранение их состояния без повторной отрисовки по соображениям производительности.

Создание событий

Иногда во Vue возникает необходимость передать данные от одного компонента к другому. Один из способов - использование метода $emit(). Его работа напоминает принцип домино, Когда мы создаём событие - оно автоматически начинает передаваться вверх по цепочке. При этом на каждом этапе его можно отловить и обработать.

Как правильно клонировать объект на JS?