Что такое директива v-bind?

v-bind — это одна из основных директив во Vue.js, которая используется для динамического связывания атрибутов и пропов с данными. Она позволяет сделать шаблон реактивным и автоматически обновлять значения атрибутов HTML-элементов при изменении соответствующих данных во Vue-приложении.

Синтаксис

<!-- Полный синтаксис -->
<a v-bind:href="url">Ссылка</a>
<!-- Короткий синтаксис (сокращение через двоеточие) -->
<a :href="url">Ссылка</a>

v-bind:attribute="expression" привязывает значение выражения к указанному атрибуту элемента. Атрибут будет обновляться, когда expression изменяется.

Как работает под капотом

Когда ты пишешь v-bind:href="url", Vue следит за реактивной переменной url в data() или computed. Если значение url изменится, Vue автоматически обновит DOM и подставит новое значение в атрибут href.

Примеры использования

1. Динамическая ссылка

<a :href="site">Перейти на сайт</a>
<script>
const { createApp } = Vue
createApp({
data() {
return {
site: 'https://example.com'
}
}
}).mount('#app')
</script>

2. Подстановка изображений

<img :src="imageUrl" :alt="imageAlt">
<script>
const { createApp } = Vue
createApp({
data() {
return {
imageUrl: 'https://picsum.photos/200',
imageAlt: 'Пример изображения'
}
}
}).mount('#app')
</script>

3. Динамическое управление классами

<div :class="active ? 'active' : 'inactive'">Контент</div>
<script>
const { createApp } = Vue
createApp({
data() {
return {
active: true
}
}
}).mount('#app')
</script>

Привязка нескольких атрибутов

Можно привязать сразу несколько атрибутов через объект:

<button v-bind="buttonAttrs">Кликни</button>
<script>
createApp({
data() {
return {
buttonAttrs: {
id: 'my-button',
class: 'btn btn-primary',
disabled: false
}
}
}
}).mount('#app')
</script>

Использование с компонентами

Когда ты передаёшь данные в компоненты через props, тоже можно использовать v-bind:

<MyButton :label="buttonText" />
<script>
app.component('MyButton', {
props: \['label'\],
template: \`<button>{{ label }}</button>\`
})
</script>

Также можно использовать v-bind для передачи всех props из объекта:

<MyButton v-bind="buttonProps" />

Привязка булевых атрибутов

Если ты передаёшь булевое значение, Vue обрабатывает его корректно:

<input type="checkbox" :checked="isChecked" />
<script>
createApp({
data() {
return {
isChecked: true
}
}
}).mount('#app')
</script>

Если isChecked = true, атрибут checked появится. Если false, он исчезнет.

С v-bind можно привязывать любые HTML-атрибуты

  • src

  • href

  • alt

  • class

  • style

  • disabled

  • readonly

  • placeholder

  • value

  • любые другие.

Динамическое имя атрибута

Vue позволяет делать даже это:

<!-- Будет то же самое, как :href="..." -->
<a v-bind:\[attributeName\]="url">Динамический атрибут</a>
<script>
createApp({
data() {
return {
attributeName: 'href',
url: 'https://example.com'
}
}
}).mount('#app')
</script>

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

Привязка стилей

Можно использовать v-bind для связывания инлайновых стилей:

<div :style="{ color: textColor, fontSize: fontSize + 'px' }">Стильный текст</div>
<script>
createApp({
data() {
return {
textColor: 'blue',
fontSize: 18
}
}
}).mount('#app')
</script>

Также поддерживаются вложенные объекты, например, transform или background.

Привязка классов

v-bind:class поддерживает:

  • Строки: class="...".

  • Объекты: { active: isActive, error: hasError }.

  • Массивы: ['btn', dynamicClass].

Пример с объектом:

<div :class="{ active: isActive, disabled: isDisabled }">...</div>
<script>
createApp({
data() {
return {
isActive: true,
isDisabled: false
}
}
}).mount('#app')
</script>

Различие между v-bind и обычными атрибутами

Если ты напишешь просто href="...", то значение будет статическим. Vue не будет за ним следить и не обновит DOM, если переменная изменится. С v-bind ты получаешь реактивность: любое изменение данных в data() автоматически отразится в DOM.

v-bind — ключевой инструмент, обеспечивающий реактивность интерфейса. Он позволяет писать чистые и динамичные шаблоны, автоматически синхронизирующиеся с данными.