Первое приложение и интерполяция

Пишем первое работающее приложение: реактивные данные через ref, их вывод в шаблоне и проверка идеи «данные → интерфейс» прямо в браузере.

Реактивная переменная — значение, за изменениями которого следит Vue: как только оно меняется, все места в шаблоне, где оно используется, обновляются автоматически.

Минимальный компонент

Соберём приветствие, которое показывает имя и реагирует на кнопку. Логика в <script setup>, разметка в <template>:

<template>
  <h1>Привет, {{ name }}!</h1>
  <p>Кликов: {{ count }}</p>
  <button @click="count++">Нажми меня</button>
</template>

<script setup>
import { ref } from 'vue'

const name = ref('Аня')
const count = ref(0)
</script>

Функция ref делает значение реактивным. В шаблоне мы пишем просто {{ count }} — без .value, Vue разворачивает ref за нас. Каждый клик увеличивает count, и строка «Кликов» обновляется сама.

Как данные становятся интерфейсом

Идея «интерфейс — это функция от данных» проверяется и в обычном JavaScript. Представим «рендер» как функцию, которая по состоянию строит строку экрана. Меняем состояние — вызываем рендер заново и получаем новый вид:

const state = { name: "Аня", count: 0 };

function render(s) {
  return `Привет, ${s.name}! Кликов: ${s.count}`;
}

console.log(render(state));
state.count += 1;
console.log(render(state));
state.name = "Борис";
console.log(render(state));

Вывод:

Привет, Аня! Кликов: 0
Привет, Аня! Кликов: 1
Привет, Борис! Кликов: 1

Вся «магия» Vue в том, что вам не нужно вручную вызывать render и подставлять результат в DOM — фреймворк делает это сам, как только меняется реактивное состояние. Вы описываете шаблон один раз, а перерисовку Vue берёт на себя.

Выражения в шаблоне

В интерполяцию можно поставить не только переменную, но и любое выражение:

<template>
  <p>{{ name }}</p>
  <p>{{ count * 2 }}</p>
  <p>{{ count > 0 ? 'Есть клики' : 'Пока ноль' }}</p>
</template>

Тернарный оператор, арифметика, вызовы методов — всё это работает. Но логику посложнее лучше выносить в вычисляемые свойства (о них в разделе про реактивность), чтобы шаблон оставался читаемым.

Частая ошибка новичка

В <script> к значению ref нужно обращаться через .value (например count.value++), а в <template> — без него ({{ count }}). Если в скрипте написать count++ вместо count.value++, реактивность не сработает. Подробно ref разберём в третьем разделе — пока просто запомните это различие.

Итог

  • ref(значение) создаёт реактивную переменную, за которой следит Vue.
  • В шаблоне ref пишется без .value — Vue разворачивает его автоматически.
  • Интерфейс во Vue — функция от данных: меняются данные, экран перерисовывается сам.
  • В скрипте к ref обращаются через .value, в шаблоне — без него.
Проверьте себя
1. Что делает функция ref() в Vue?
AСоздаёт ссылку на DOM-элемент по умолчанию
BСоздаёт реактивную переменную, за изменениями которой Vue следит и обновляет интерфейс
CИмпортирует другой компонент
DЗамораживает объект, запрещая его менять
2. Как обращаться к значению ref в шаблоне <template>?
AЧерез .value, например {{ count.value }}
BПросто по имени, например {{ count }} — Vue разворачивает ref сам
CЧерез метод .get()
DЧерез this.count
3. Почему в скрипте важно писать count.value++, а не count++?
Acount++ вызовет ошибку синтаксиса
Bref — это объект-обёртка, и реальное значение лежит в свойстве .value; без него реактивность не сработает
CЭто просто стиль, разницы нет
Dcount++ работает только в Options API
Поддержать проект