Встроенные директивы
v-text
Обновление текстового содержимого элемента.
Ожидает:
string
Подробности
v-text
работает путём установки свойства textContent элемента, поэтому он будет перезаписывать всё существующее содержимое внутри элемента. Если необходимо обновить частьtextContent
, то вместо этого следует использовать текстовые интерполяции.Пример
template<span v-text="msg"></span> <!-- тоже самое --> <span>{{msg}}</span>
v-html
Обновление свойства innerHTML элемента.
Ожидает:
string
Подробности
Содержимое
v-html
вставляется как обычный HTML - синтаксис шаблонов Vue не обрабатывается. Если вы пытаетесь составить шаблоны с помощьюv-html
, попробуйте переосмыслить решение, используя вместо этого компоненты.Примечание о безопасности
Динамический рендеринг произвольного HTML на вашем сайте может быть очень опасен, поскольку легко может привести к XSS-атакам. Используйте
v-html
только для доверенного содержимого и никогда для содержимого, предоставляемого пользователем.В однофайловых компонентах стили
scoped
не будут применяться к содержимому внутриv-html
, поскольку этот HTML не обрабатывается компилятором шаблонов Vue. Если вы хотите использовать на содержимомv-html
скопированный CSS, то вместо этого можно использовать CSS модули или дополнительный глобальный элемент<style>
с ручной стратегией области применения, например BEM.Пример
template<div v-html="html"></div>
См. также Синтаксис шаблонов - Сырой HTML
v-show
Переключение видимости элемента в зависимости от истинности значения выражения.
Ожидает:
any
Подробности
v-show
работает, устанавливая CSS-свойствоdisplay
с помощью встроенных стилей, и будет стараться соблюдать начальное значениеdisplay
, когда элемент становится видимым. Также он запускает переходы анимации при изменении состояния.См. также Условная отрисовка - v-show
v-if
Условное отображение элемента или фрагмента шаблона на основе истинности значения выражения.
Ожидает:
any
Подробности
При переключении директивы компонента
v-if
, элемент и содержащиеся в нём директивы/компоненты уничтожаются и создаются заново. Если начальное условие false, то внутреннее содержимое вообще не будет выведено.Может использоваться на
<template>
для обозначения условного блока, содержащего только текст или несколько элементов.Эта директива запускает переходы анимации при изменении своего состояния.
При совместном использовании
v-if
имеет более высокий приоритет, чемv-for
. Мы не рекомендуем использовать эти две директивы вместе на одном элементе — подробнее об этом см. в руководстве по отрисовке списков.См. также Условная отрисовка - v-if
v-else
Обозначает "блок else" для v-if
или цепочку v-if
/ v-else-if
.
Не ожидает выражения
Подробности
Ограничение: предыдущий соседний элемент должен иметь
v-if
илиv-else-if
.Может использоваться на
<template>
для обозначения условного блока, содержащего только текст или несколько элементов.
Пример
template<div v-if="Math.random() > 0.5"> Сейчас ты видишь меня </div> <div v-else> А сейчас нет </div>
См. также Условная отрисовка - v-else
v-else-if
Обозначает "блок else if" для v-if
. Можно использовать для создания цепочек условий.
Ожидает:
any
Подробности
Ограничение: предыдущий соседний элемент должен иметь
v-if
илиv-else-if
.Может использоваться на
<template>
для обозначения условного блока, содержащего только текст или несколько элементов.
Пример
template<div v-if="type === 'A'"> A </div> <div v-else-if="type === 'B'"> B </div> <div v-else-if="type === 'C'"> C </div> <div v-else> Не A/B/C </div>
См. также Условная отрисовка - v-else-if
v-for
Многократная отрисовка элемента или блока шаблона на основе исходных данных.
Ожидает:
Array | Object | number | string | Iterable
Подробности
Значение директивы должно использовать специальный синтаксис
alias in expression
для указания псевдонима текущего итерируемого элемента:template<div v-for="item in items"> {{ item.text }} </div>
Кроме того, можно указать псевдоним для индекса (или ключа, если он используется для объекта):
template<div v-for="(item, index) in items"></div> <div v-for="(value, key) in object"></div> <div v-for="(value, name, index) in object"></div>
По умолчанию
v-for
будет обновлять элементы «на месте», не перемещая их. Если необходимо переупорядочивать элементы при изменениях, то потребуется указывать специальный атрибутkey
:template<div v-for="item in items" :key="item.id"> {{ item.text }} </div>
v-for
может также работать со значениями, реализующими протокол Iterable, включая нативныеMap
иSet
.См. также
v-on
Прикрепление к элементу обработчика событий.
Сокращённая запись:
@
Ожидает:
Function | Inline Statement | Object (без аргументов)
Аргумент:
event
(необязательно, если используется синтаксис Object)Модификаторы
.stop
- вызываетevent.stopPropagation()
..prevent
- вызываетevent.preventDefault()
..capture
- добавить обработчик событий в capture режиме..self
- запускать обработчик только в том случае, если событие было отправлено именно от этого элемента..{keyAlias}
- запускать обработчик только по определенным клавишам..once
- обработчик сработает только один раз..left
- обработчик срабатывания только для событий левой кнопки мыши..right
- обработчик срабатывания только для событий правой кнопки мыши..middle
- обработчик срабатывания только для событий средней кнопки мыши..passive
- добавляет обработчик DOM события с параметром{ passive: true }
.
Подробности
Тип события обозначается аргументом. Выражение может быть именем метода, строковым оператором или опущено, если присутствуют модификаторы.
При использовании на обычном элементе он прослушивает только нативные DOM события. При использовании на компоненте он прослушивает пользовательские события, генерируемые в дочернем компоненте.
При прослушивании нативных DOM событий метод получает нативное событие в качестве единственного аргумента. При использовании inline-выражения, выражение имеет доступ к специальному свойству
$event
:v-on:click="handle('ok', $event)"
.v-on
также поддерживает привязку к объекту пар событие/слушатель без аргумента. Обратите внимание, что при использовании синтаксиса объекта он не поддерживает никаких модификаторов.Пример
template<!-- метод в качестве обработчика --> <button v-on:click="doThis"></button> <!-- динамическое событие --> <button v-on:[event]="doThis"></button> <!-- inline-выражение --> <button v-on:click="doThat('hello', $event)"></button> <!-- сокращённая запись --> <button @click="doThis"></button> <!-- окращённая запись динамического события --> <button @[event]="doThis"></button> <!-- stop propagation --> <button @click.stop="doThis"></button> <!-- prevent default --> <button @click.prevent="doThis"></button> <!-- prevent default без выражения --> <form @submit.prevent></form> <!-- цепочка из модификаторов --> <button @click.stop.prevent="doThis"></button> <!-- модификатор клавиши с использованием keyAlias --> <input @keyup.enter="onEnter" /> <!-- обработчик события будет вызван не больше одного раза --> <button v-on:click.once="doThis"></button> <!-- объектный синтаксис --> <button v-on="{ mousedown: doThis, mouseup: doThat }"></button>
Отслеживание пользовательских событий на дочернем компоненте (обработчик вызывается, когда в дочернем компоненте будет сгенерировано событие "my-event"):
template<MyComponent @my-event="handleThis" /> <!-- inline statement --> <MyComponent @my-event="handleThis(123, $event)" />
См. также
v-bind
Динамически привязывает один или несколько атрибутов или входных параметров компонента к выражению.
Сокращённая запись
:
или.
(при использовании модификатора.prop
)- Пропуск значения (когда атрибут и связанное значение имеют одинаковое имя) requires 3.4+
Ожидает:
any (если указан аргумент) | Object (без аргумента)
Аргумент:
attrOrProp (опционально)
Модификаторы
.camel
- преобразование имён атрибутов из kebab-case в camelCase..prop
- принудительная установить привязку в качестве свойства DOM (3.2+)..attr
- принудительно установить привязку в качестве атрибута DOM (3.2+).
Применение
При использовании для привязки атрибутов
class
илиstyle
,v-bind
поддерживает дополнительные типы значений, такие как Array или Objects. Более подробная информация приведена в разделе руководства по ссылкам ниже.Устанавливая привязку к элементу, Vue по умолчанию проверяет, имеет ли элемент ключ, определенный как свойство, используя проверку оператора
in
. Если свойство определено, то Vue установит значение как свойство DOM, а не как атрибут. В большинстве случаев это должно работать, но вы можете переопределить это поведение, явно используя модификаторы.prop
или.attr
. Иногда это необходимо, особенно при работе с пользовательскими элементами.При привязке входных параметров к дочернему компоненту необходимо также объявлять их внутри него.
При использовании без аргумента можно привязать объект из пар имя-значение.
Пример
template<!-- привязка атрибута --> <img v-bind:src="imageSrc" /> <!-- динамическое название атрибута --> <button v-bind:[key]="value"></button> <!-- сокращённая запись --> <img :src="imageSrc" /> <!-- сокращение при одинаковом названии (3.4+), расширяется до :src="src" --> <img :src /> <!-- сокращённая запись при динамическом названии атрибута --> <button :[key]="value"></button> <!-- инлайн-выражение с конкатенацией строк --> <img :src="'/path/to/images/' + fileName" /> <!-- привязка классов --> <div :class="{ red: isRed }"></div> <div :class="[classA, classB]"></div> <div :class="[classA, { classB: isB, classC: isC }]"></div> <!-- привязка стилей --> <div :style="{ fontSize: size + 'px' }"></div> <div :style="[styleObjectA, styleObjectB]"></div> <!-- привязка объекта с атрибутами --> <div v-bind="{ id: someProp, 'other-attr': otherProp }"></div> <!-- привязка входного параметра. "prop" должен быть объявлен в my-component. --> <MyComponent :prop="someThing" /> <!-- передача всех входных параметров родительского компонента в дочерний --> <MyComponent v-bind="$props" /> <!-- XLink --> <svg><a :xlink:special="foo"></a></svg>
Модификатор
.prop
также имеет сокращённую запись.
:template<div :someProperty.prop="someObject"></div> <!-- эквивалент --> <div .someProperty="someObject"></div>
Модификатор
.camel
позволяет приводить имя атрибутаv-bind
в camelCase при использовании DOM-шаблонов, например для атрибута SVGviewBox
:template<svg :view-box.camel="viewBox"></svg>
Модификатор
.camel
не нужен, если вы используете строковые шаблоны или предварительно компилируете шаблон на этапе сборки.См. также
v-model
Создает двустороннее связывание с элементом ввода формы или с компонентом.
Ожидает: варьируется в зависимости от элемента формы или работы компонента
Использование ограничено
<input>
<select>
<textarea>
- компоненты
Модификаторы
См. также
v-slot
Обозначение именованного слота или слота, который получает входные параметры.
Сокращённая запись:
#
Ожидает: JavaScript-выражение, допустимое в позиции аргумента функции, включая поддержку деструктуризации. Необязательный - нужен только в том случае, если ожидается передача входного параметра в слот.
Аргумент: название слота (опционально, по умолчанию
default
)Использование ограничено:
<template>
- компонентами (для единственного слота по умолчанию с входными параметрами)
Пример
template<!-- Именованный слот --> <BaseLayout> <template v-slot:header> Содержимое для заголовка </template> <template v-slot:default> Содержимое для слота по умолчанию </template> <template v-slot:footer> Содержимое для подвала </template> </BaseLayout> <!-- Именованный слот с входными параметрами --> <InfiniteScroll> <template v-slot:item="slotProps"> <div class="item"> {{ slotProps.item.text }} </div> </template> </InfiniteScroll> <!-- Слот по умолчанию с входными параметрами и деструктуризацией --> <Mouse v-slot="{ x, y }"> Mouse position: {{ x }}, {{ y }} </Mouse>
См. также
v-pre
Пропускает компиляцию для элемента и всех его потомков.
Не ожидает выражения
Подробности
Внутри элемента с
v-pre
весь синтаксис шаблона Vue будет сохранен и отображён как есть. Наиболее распространённый вариант использования этого элемента - отображение тегов фигурных скобок.Пример
template<span v-pre>{{ это не будет скомпилировано }}</span>
v-once
Отрисовка элемента и компонента выполняется только один раз, а последующие обновления пропускаются.
Не ожидает выражения
Подробности
При последующих повторных отрисовках этот элемент/компонент и все его дочерние элементы будут рассматриваться как статическое содержимое и пропускаться. Это может быть использовано для оптимизации производительности при обновлении.
template<!-- элемент --> <span v-once>Это значение никогда не изменится: {{msg}}</span> <!-- элемент с потомками --> <div v-once> <h1>Комментарий</h1> <p>{{msg}}</p> </div> <!-- компонент --> <MyComponent v-once :comment="msg"></MyComponent> <!-- директива `v-for` --> <ul> <li v-for="i in list" v-once>{{i}}</li> </ul>
Начиная с версии 3.2, можно использовать мемоизацию части шаблона, с возможностью указания условий для инвалидации, с помощью директивы
v-memo
.См. также
v-memo
Поддерживается только в версиях 3.2+
Ожидает:
any[]
Подробности
Мемоизация части поддерева шаблона. Может использоваться как для элементов, так и для компонентов. Директива ожидает массив фиксированной длины зависимых значений, которые станут использоваться для сравнения при мемоизации. Если каждое значение массива осталось таким же, как при последней отрисовке, то обновление всего поддерева будет пропущено. Например:
template<div v-memo="[valueA, valueB]"> ... </div>
При повторном рендеринге компонента, если
valueA
иvalueB
остались прежними, все обновления для этого<div>
и его дочерних элементов будут пропущены. Фактически, будет пропущено даже создание VNode виртуального DOM, поскольку мемоизированная копия поддерева может быть использована повторно.Важно правильно указать массив мемоизации, иначе мы можем пропустить обновления, которые действительно должны быть применены.
v-memo
с пустым массивом зависимостей (v-memo="[]"
) будет функционально эквивалентенv-once
.Использование вместе с
v-for
v-memo
предоставляется исключительно для микрооптимизации в критичных к производительности сценариях и может понадобиться крайне редко. Наиболее распространённым случаем, когда это может оказаться полезным, является отрисовка больших списковv-for
(когдаlength > 1000
):template<div v-for="item in list" :key="item.id" v-memo="[item.id === selected]"> <p>ID: {{ item.id }} - выбран: {{ item.id === selected }}</p> <p>...больше дочерних элементов</p> </div>
При изменении состояния компонента
selected
будет создано большое количество VNodes, даже если большинство элементов остались прежними. Использованиеv-memo
здесь, по сути, говорит: "обновляйте этот элемент только в том случае, если он перешел из состоянияне выбран
в состояниевыбран
, или наоборот". Это позволяет каждому незатронутому элементу повторно использовать свой предыдущий VNode и полностью пропустить операцию сравнения. Обратите внимание, что нам не нужно включатьitem.id
в массив зависимостей memo, поскольку Vue автоматически определяет его из:key
элемента.Предупреждение
При использовании
v-memo
сv-for
убедитесь, что они используются на одном и том же элементе.v-memo
не работает внутриv-for
..v-memo
также может быть использовано для компонентов, чтобы вручную предотвратить нежелательные обновления в некоторых крайних случаях, когда проверка обновлений дочерних компонентов была де-оптимизирована. Но, повторимся, ответственность за корректное указание массивов зависимостей во избежание пропуска необходимых обновлений лежит на разработчике.См. также
v-cloak
Используется для скрытия еще нескомпилированного шаблона до тех пор, пока он не будет готов.
Не ожидает выражения
Подробности
Данная директива нужна только для окружения без этапа сборки.
При использовании DOM шаблонов может возникнуть "вспышка некомпилированных шаблонов": пользователь может видеть необработанные теги фигурных скобок, пока монтируемый компонент не заменит их отрисованным содержимым.
v-cloak
будет оставаться на элементе до тех пор, пока не будет смонтирован связанный с ним экземпляр компонента. В сочетании с правилами CSS, такими как[v-cloak] { display: none }
, это может быть использовано для скрытия необработанных шаблонов до тех пор, пока компонент не будет готов.Пример
css[v-cloak] { display: none; }
template<div v-cloak> {{ message }} </div>
До завершения компиляции
<div>
не будет виден.