Руководство
Основы
- Установка
- Введение
- Экземпляр Vue
- Синтаксис шаблонов
- Вычисляемые свойства и слежение
- Работа с классами и стилями
- Условная отрисовка
- Отрисовка списков
- Обработка событий
- Работа с формами
- Основы компонентов
Продвинутые компоненты
- Регистрация компонентов
- Входные параметры
- Пользовательские события
- Слоты
- Динамические и асинхронные компоненты
- Обработка крайних случаев
Переходы и анимации
- Анимирование списков и появления/исчезновения
- Анимирование переходов между состояниями
Переиспользование и композиция
- Примеси
- Пользовательские директивы
- Render-функции и JSX
- Плагины
- Фильтры
Инструментарий
- Однофайловые компоненты
- Тестирование
- Поддержка TypeScript
- Публикация на production
Масштабирование
- Роутинг
- Управление состоянием приложения
- SSR. Отрисовка на стороне сервера
- Безопасность
Продвинутые темы
- Подробно о реактивности
Вопросы миграции
- Миграция с Vue 1.x
- Миграция с Vue Router 0.7.x
- Миграция с Vuex 0.6.x на 1.0
Мета
- Сравнение с другими фреймворками
- Присоединяйтесь к сообществу Vue.js!
- Познакомьтесь с командой
Эта документация для версий v2.x и ранее. Для v3.x, документация на русском здесь.
Вычисляемые свойства и слежение
Вычисляемые свойства
Встраиваемые в шаблоны выражения удобны, но могут предназначаться только для простых операций. При усложнении логики их труднее поддерживать:
|
Такой шаблон уже не выглядит простым и декларативным. С первого взгляда и не скажешь, что он всего лишь отображает message
задом наперёд. Ситуация станет ещё хуже, если эту логику потребуется использовать в нескольких местах шаблона.
На помощь здесь приходят вычисляемые свойства.
Простой пример
|
|
Результат:
Изначальное сообщение: «{{ message }}»
Сообщение задом наперёд: «{{ reversedMessage }}»
Мы определили вычисляемое свойство reversedMessage
. Написанная нами функция будет использоваться как геттер свойства vm.reversedMessage
:
|
Вы можете открыть консоль и поиграть с примером самостоятельно. Значение vm.reversedMessage
всегда зависит от значения vm.message
.
В шаблонах можно обращаться к вычисляемым свойствам как и к обычным. Vue знает, что vm.reversedMessage
зависит от vm.message
, поэтому при обновлении vm.message
обновятся и все зависящие от него элементы, в нашем случае обновится vm.reversedMessage
. Самое важное — эту зависимость теперь мы указали декларативно: геттер вычисляемого свойства не имеет побочных эффектов, что упрощает понимание кода и его тестирование.
Кэширование вычисляемых свойств
Можно заметить, что такого же результата можно достичь и с помощью метода:
|
|
Вместо вычисляемого свойства, можно использовать ту же самую функцию в качестве метода. С точки зрения конечного результата, оба подхода делают одно и то же. Но есть важное отличие: вычисляемые свойства кэшируются, основываясь на своих реактивных зависимостях. Вычисляемое свойство пересчитывается лишь тогда, когда изменится одна из его реактивных зависимостей. Поэтому, пока message
остаётся неизменным, многократное обращение к reversedMessage
будет каждый раз возвращать единожды вычисленное значение, не запуская функцию вновь.
Обратите внимание, что следующее вычисляемое свойство никогда не обновится, поскольку Date.now()
не является реактивной зависимостью:
|
Использование метода, напротив, будет запускать функцию всегда, при каждом обращении к нему.
Зачем нужно кэширование? Представьте, есть «дорогое» вычисляемое свойство A, требующее цикла по огромному массиву и выполняющее множество вычислений. И пусть ещё будут другие вычисляемые свойства, в свою очередь, зависящие от A. Без кэширования геттер A будет запускаться куда чаще необходимого! В тех же случаях, когда кэширования нужно избежать — используйте методы.
Вычисляемые свойства и слежение
Vue предоставляет и более общий способ наблюдения и реагирования на изменения данных в экземпляре: слежение за свойствами. Когда есть данные, которые необходимо обновлять при изменении других данных, возникает соблазн избыточно использовать только этот подход, особенно если привыкли к Angular. Но, как правило, лучше использовать вычисляемые свойства, а не императивный коллбэк в watch
. Рассмотрим пример:
|
|
Код выше — императивный и избыточный. Сравните с версией с использованием вычисляемого свойства:
|
Так гораздо лучше, не правда ли?
Сеттеры вычисляемых свойств
По умолчанию вычисляемые свойства работают только на чтение, но при необходимости можно также указать и сеттер:
|
Теперь запись vm.fullName = 'Иван Иванов'
вызовет сеттер, и vm.firstName
и vm.lastName
будут соответствующим образом обновлены.
Методы-наблюдатели
Хотя в большинстве случаев лучше использовать вычисляемые свойства, иногда необходимы пользовательские методы-наблюдатели. Поэтому Vue предоставляет более общий способ реагирования на изменения в данных через опцию watch
. Эта возможность полезна для «дорогих» или асинхронных операций, выполняемых в ответ на изменение данных.
Рассмотрим пример:
|
|
Результат:
Задайте вопрос, на который можно ответить «да» или «нет»:
{{ answer }}
В данном случае использование опции watch
позволило выполнять асинхронную операцию (обращение к API), ограничивать частоту выполнения этой операции и устанавливать промежуточные состояния до получения ответа от сервера. Ничего из этого не удалось бы достичь с помощью вычисляемых свойств.
Кроме опции watch
можно также использовать vm.$watch в императивном стиле.