Что такое Vue.js и в чём его основная идея?

JuniorVue.js #vue #basics

Вопрос

Что такое Vue.js, какая у него основная идея и чем это отличается от манипуляции DOM руками?

Короткий ответ

Vue.js — это прогрессивный JavaScript-фреймворк для построения пользовательских интерфейсов, основанный на декларативном описании UI как функции от состояния и реактивности: при изменении данных Vue сам находит, какие части DOM нужно обновить, и делает это эффективно. Приложение собирается из переиспользуемых компонентов.

Подробный ответ

В классическом подходе (vanilla JS) разработчик сам находит нужный элемент через document.querySelector, вручную меняет его textContent, добавляет и убирает классы, навешивает и снимает обработчики событий — то есть императивно описывает, как изменить DOM шаг за шагом. С ростом приложения такой код быстро превращается в клубок ручной синхронизации состояния и разметки.

Vue предлагает другой подход:

  • Декларативность. Разработчик описывает шаблон (template) как отображение состояния: {{ count }}, v-if="isVisible", :class="{ active }}". Не нужно писать код, который меняет DOM — нужно один раз описать, каким DOM должен быть при том или ином состоянии.
  • Реактивность. Данные компонента оборачиваются в реактивную систему (ref/reactive). Когда значение меняется, Vue автоматически перерисовывает только те части шаблона, которые от него зависят, используя виртуальный DOM и эффективное сравнение (diffing) для минимизации реальных изменений в браузере.
  • Компонентный подход. UI разбивается на независимые, переиспользуемые компоненты — каждый инкапсулирует свою разметку, логику и стили. Компоненты общаются через props (сверху вниз) и события (снизу вверх).
  • Single-File Component (.vue) — файл, где в одном месте лежат <template>, <script setup> и <style> конкретного компонента. Это удобнее, чем разносить HTML/JS/CSS по разным файлам, и даёт компилятору Vue возможность оптимизировать каждую часть (например, ограничить <style scoped> только этим компонентом).

Таким образом, Vue берёт на себя синхронизацию состояния и представления — разработчик описывает что показать, а не как обновлять DOM на каждое изменение.

Пример

<!-- Counter.vue -->
<script setup>
import { ref } from 'vue'

const count = ref(0)
function increment() {
  count.value++
}
</script>

<template>
  <button @click="increment">
    Счётчик: {{ count }}
  </button>
</template>

<style scoped>
button {
  padding: 8px 16px;
}
</style>

Сравните с vanilla JS-эквивалентом, где пришлось бы вручную создавать элемент, вешать addEventListener и на каждый клик вручную обновлять textContent:

const button = document.createElement('button')
let count = 0
button.textContent = `Счётчик: ${count}`
button.addEventListener('click', () => {
  count++
  button.textContent = `Счётчик: ${count}` // ручная синхронизация
})
document.body.appendChild(button)

Дополнительные вопросы

  • Что такое виртуальный DOM и зачем он нужен?
  • Чем однофайловый компонент (.vue) отличается от обычного JS-модуля с шаблонной строкой?
  • Что значит «прогрессивный фреймворк» применительно к Vue?