Реактивные переменные - концепция reactive и практические примеры

28 января 2026
Автор

Олег Марков

Введение

Реактивные переменные (reactive) — это переменные, изменение которых автоматически приводит к обновлению всех зависимых от них частей приложения. Вам не нужно вручную вызывать функции обновления интерфейса, синхронизировать несколько значений или следить, что вы где‑то забыли перерисовать компонент — фреймворк делает это за вас.

Смотрите, идея очень простая: вы объявляете значение и говорите системе — «следи за ним и везде, где оно используется, при изменении пересчитай результат». На этом строится современный frontend (Vue, Svelte, Solid, часть возможностей React), а также многие решения в backend и dataflow‑системах (RxJS, MobX и т.п.).

В этой статье я покажу вам:

  • что такое реактивность концептуально;
  • чем реактивные переменные отличаются от «обычных»;
  • как это реализовано во Vue (ref, reactive, computed);
  • как похожая идея выглядит в Svelte и React;
  • какие подводные камни есть у реактивного подхода;
  • как не превратить код в хаос из «магии обновлений».

Будем опираться на практические примеры и параллельно разбирать, что происходит под капотом.


Что такое реактивные переменные

Основная идея реактивности

Если упростить, реактивная переменная — это:

  • хранилище значения;
  • к которому можно «подписаться»;
  • и которое уведомляет подписчиков при каждом изменении.

Давайте разберемся на очень абстрактном примере — без привязки к конкретному фреймворку:

// Псевдореализация простой реактивной переменной

function createReactive(initialValue) {
  let value = initialValue           // Текущее хранимое значение
  const subscribers = new Set()      // Набор подписчиков

  function get() {
    // Здесь можно было бы регистрировать зависимость
    return value                     // Просто возвращаем текущее значение
  }

  function set(newValue) {
    if (Object.is(newValue, value)) {
      return                         // Если значение не изменилось - ничего не делаем
    }
    value = newValue                 // Обновляем значение
    subscribers.forEach(fn => fn(value))  // Уведомляем всех подписчиков
  }

  function subscribe(fn) {
    subscribers.add(fn)              // Добавляем подписчика
    return () => subscribers.delete(fn) // Возвращаем функцию отписки
  }

  return { get, set, subscribe }
}

// Здесь мы создаем реактивную переменную count
const count = createReactive(0)

// Подписываемся на изменения переменной count
const unsubscribe = count.subscribe(v => {
  console.log("Новое значение count:", v)
})

// Устанавливаем новое значение - сработает подписчик
count.set(1) // Выведет "Новое значение count: 1"

// Отписываемся - больше не получаем обновления
unsubscribe()
count.set(2) // Подписчики не вызываются

Как видите, в основе всегда одна и та же идея: слежение за изменениями и обновление зависимостей. Разные фреймворки по‑разному реализуют это слежение и обновление, но суть остается неизменной.

В чем отличие от обычных переменных

Обычные переменные:

  • просто хранят значение;
  • никак не связаны с интерфейсом;
  • при изменении ничего сами не инициируют.

Реактивные переменные:

  • знают, кто от них зависит;
  • автоматически запускают пересчет зависимых выражений/компонентов;
  • часто имеют «обертку» (объект, proxy, getter/setter), а не являются «голым» значением.

Поэтому частое правило: доступ к реактивной переменной чуть менее «прямой», чем к обычной, зато вы получаете автоматическое обновление всего, что от нее зависит.


Реактивность во Vue 3 - ref, reactive, computed

Vue 3 — один из самых наглядных примеров реактивности, потому что он использует и примитивные реактивные переменные (ref), и реактивные объекты (reactive), и вычисляемые значения (computed). Здесь я покажу вам, как это выглядит на практике.

ref - реактивная обертка над значением

ref — это способ сделать реактивным примитивное значение (число, строку, boolean и т.п.) или вообще любое значение.

import { ref } from "vue"

export default {
  setup() {
    // Здесь мы создаем реактивную переменную count
    const count = ref(0)

    // Функция увеличения счетчика
    function increment() {
      // Обратите внимание - меняем count через .value
      count.value++
    }

    return {
      count,       // Передаем во view
      increment,   // Экспортируем функцию
    }
  },
}

В шаблоне:

<template>
  <!-- Vue автоматически "разворачивает" .value -->
  <p>Текущее значение - {{ count }}</p>
  <button @click="increment">Увеличить</button>
</template>

Ключевые моменты:

  • внутри setup вы обращаетесь к значению ref через .value;
  • в шаблоне Vue сам подставляет .value, и вы пишете просто {{ count }};
  • при изменении count.value Vue понимает, какие части шаблона зависят от этого значения, и обновляет только их.

reactive - реактивный объект

Когда значение сложное (объект, массив), удобнее использовать reactive — он создает Proxy поверх объекта и делает все его поля реактивными.

import { reactive } from "vue"

export default {
  setup() {
    // Здесь мы создаем реактивный объект state
    const state = reactive({
      count: 0,
      user: {
        name: "Alex",
      },
      items: [],
    })

    function increment() {
      // Для reactive не нужен .value
      state.count++
    }

    function addItem(name) {
      // Здесь добавляем новый элемент в массив items
      state.items.push({ name })
    }

    return {
      state,
      increment,
      addItem,
    }
  },
}

В шаблоне:

<template>
  <p>Счетчик - {{ state.count }}</p>
  <p>Пользователь - {{ state.user.name }}</p>

  <ul>
    <li v-for="item in state.items" :key="item.name">
      {{ item.name }}
    </li>
  </ul>

  <button @click="increment">+1</button>
  <button @click="addItem('Новый элемент')">Добавить</button>
</template>

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

  • Vue оборачивает объект в Proxy;
  • когда вы читаете state.count, Vue регистрирует зависимость текущего эффекта (компонента, вычисляемого свойства и т.п.);
  • когда вы изменяете state.count, Vue запускает все эффекты, которые зависят от этого поля.

computed - реактивные вычисляемые значения

Часто вам нужно хранить не только «сырые» данные, но и производные — например, отфильтрованный список, форматированную строку, сумму двух значений. Вычисляемые значения (computed) — это реактивные переменные, которые зависят от других реактивных переменных.

import { ref, computed } from "vue"

export default {
  setup() {
    // Здесь мы создаем реактивную переменную price
    const price = ref(100)

    // Здесь мы создаем реактивную переменную quantity
    const quantity = ref(2)

    // Здесь мы создаем вычисляемое значение total
    const total = computed(() => {
      // total автоматически перелсчитывается
      // когда меняется price.value или quantity.value
      return price.value * quantity.value
    })

    return {
      price,
      quantity,
      total,
    }
  },
}

В шаблоне:

<template>
  <p>Цена - {{ price }}</p>
  <p>Количество - {{ quantity }}</p>
  <p>Итого - {{ total }}</p>
</template>

Важно:

  • computed кэшируется — функция пересчитывается только при изменении зависимостей;
  • в отличие от обычной функции total(), computed знает, от каких реактивных значений он зависит.

Когда использовать ref, а когда reactive

Небольшие правила, которыми удобно пользоваться:

  • ref — для примитивов (чисел, строк, boolean) и единичных значений;
  • reactive — для объектов и структур состояния (state) с несколькими полями;
  • computed — для любых значений, которые можно вычислить из других реактивных переменных.

Смотрите, вот типичный пример смешанного подхода:

import { ref, reactive, computed } from "vue"

export default {
  setup() {
    // Примитив - ref
    const search = ref("")

    // Объект состояния - reactive
    const state = reactive({
      items: [
        { id: 1, name: "Apple" },
        { id: 2, name: "Banana" },
        { id: 3, name: "Orange" },
      ],
    })

    // Фильтрация - computed
    const filteredItems = computed(() => {
      const term = search.value.toLowerCase()
      return state.items.filter(item =>
        item.name.toLowerCase().includes(term),
      )
    })

    function setSearch(value) {
      // Здесь обновляем строку поиска
      search.value = value
    }

    return {
      search,
      state,
      filteredItems,
      setSearch,
    }
  },
}

В этом примере вы видите связку:

  • «сырые» данные — state;
  • контролируемый ввод — search;
  • производная коллекция — filteredItems.

Как фреймворки отслеживают зависимости

Чтобы вы лучше понимали, что происходит при работе с реактивными переменными, давайте очень коротко разберем механизм отслеживания зависимостей. Это поможет избежать странных багов.

Автоматическая регистрация зависимостей

Основная идея:

  1. Есть глобальное понятие «текущий эффект» — например, рендер компонента или вычисление computed.
  2. Когда этот эффект выполняется, он читает реактивные значения.
  3. Реактивная система запоминает, что «эффект A зависит от переменной X».
  4. Когда X меняется, система знает, какие эффекты нужно запустить снова.

Простейший псевдокод:

// Глобальная переменная с текущим эффектом
let currentEffect = null

function autorun(effect) {
  // Здесь мы устанавливаем текущий эффект
  currentEffect = effect
  effect()           // Выполняем функцию - в ней будут чтения реактивных переменных
  currentEffect = null
}

function createReactive(initialValue) {
  let value = initialValue
  const deps = new Set()  // Список эффектов, которые зависят от этой переменной

  function get() {
    if (currentEffect) {
      // Если сейчас выполняется эффект - регистрируем зависимость
      deps.add(currentEffect)
    }
    return value
  }

  function set(newValue) {
    if (Object.is(newValue, value)) return
    value = newValue
    // Запускаем все эффекты, которые зависят от этой переменной
    deps.forEach(effect => effect())
  }

  return { get, set }
}

// Здесь мы создаем реактивную переменную count
const count = createReactive(0)

// Регистрируем эффект с помощью autorun
autorun(() => {
  console.log("Сейчас count =", count.get())
})

// Меняем значение - эффект будет вызван еще раз
count.set(1) // Выведет "Сейчас count = 1"

Реальные фреймворки используют более сложные структуры (WeakMap, Map, отдельные трекеры для полей объектов), но принцип остается таким же.


Реактивность в Svelte

Svelte предлагает одну из самых простых для восприятия форм реактивных переменных — вам даже не нужно вызывать специальные функции.

Базовая реактивность через присваивание

В Svelte любая переменная в компоненте считается «реактивной», если ее значение используется в шаблоне.

<script>
  // Здесь мы создаем реактивные переменные count и double
  let count = 0
  let double = count * 2

  function increment() {
    // Простое присваивание - триггерит реактивность
    count = count + 1
    double = count * 2
  }
</script>

<p>Счетчик - {count}</p>
<p>Удвоенное значение - {double}</p>
<button on:click={increment}>+1</button>

Svelte компилирует компонент в чистый JS-код, где:

  • переменные превращаются в поля;
  • шаблон — в набор функций обновления;
  • каждое присваивание вызывает соответствующие функции обновления.

Реактивные метки ($:)

Чтобы не пересчитывать все вручную, есть «реактивные метки»:

<script>
  // Здесь мы создаем реактивную переменную count
  let count = 0

  // Здесь мы задаем реактивное выражение для double
  $: double = count * 2 // Вычислится при каждом изменении count

  function increment() {
    count++
  }
</script>

<p>Счетчик - {count}</p>
<p>Удвоенное значение - {double}</p>
<button on:click={increment}>+1</button>

Как видите, это очень похоже на computed, только в более декларативной записи.


Реактивность в React - useState и useEffect

В React нет «классической» реактивности через Proxy или get/set, но на уровне поведения эффекты похожи: изменение состояния вызывает повторный рендер, а useEffect позволяет подписаться на изменения зависимостей.

useState как минимальная форма реактивной переменной

import { useState } from "react"

function Counter() {
  // Здесь мы создаем "реактивную" пару [state, setState]
  const [count, setCount] = useState(0)

  function increment() {
    // Обновление состояния триггерит повторный рендер компонента
    setCount(prev => prev + 1)
  }

  return (
    <div>
      <p>Счетчик - {count}</p>
      <button onClick={increment}>+1</button>
    </div>
  )
}

Для разработчика это напоминает работу с реактивной переменной: при изменении значения интерфейс обновляется. Но технически React просто вызывает компонент как функцию еще раз и генерирует новый «виртуальный DOM», а потом сравнивает его с предыдущим.

useEffect как подписка на изменения

useEffect — это аналог подписки на изменения зависимостей:

import { useState, useEffect } from "react"

function Logger() {
  // Здесь мы создаем состояние count
  const [count, setCount] = useState(0)

  useEffect(() => {
    // Этот эффект выполнится каждый раз, когда изменится count
    console.log("Новое значение count:", count)
  }, [count]) // Массив зависимостей

  return (
    <button onClick={() => setCount(c => c + 1)}>
      Увеличить - {count}
    </button>
  )
}

По сути:

  • count — состояние, изменение которого вызывает перерендер;
  • useEffect с зависимостью [count] — функция, подписанная на это состояние.

Если посмотреть концептуально, это тоже реактивная модель, просто реализованная не через Proxy, а через явные вызовы setState и эффекты.


Типовые сценарии использования реактивных переменных

Теперь давайте посмотрим, какие типовые задачи удобно решать через реактивные переменные.

Управление формами

Формы — идеальный пример: значение поля меняется, и вы хотите автоматически:

  • показывать ошибки валидации;
  • изменять доступность кнопок;
  • отображать подсказки.

На примере Vue:

import { reactive, computed } from "vue"

export default {
  setup() {
    // Здесь мы создаем реактивное состояние формы
    const form = reactive({
      email: "",
      password: "",
      rememberMe: false,
    })

    // Здесь мы создаем реактивные ошибки
    const errors = reactive({
      email: "",
      password: "",
    })

    const isValid = computed(() => {
      // Простая проверка - есть ли ошибки
      return !errors.email && !errors.password
    })

    function validateEmail() {
      // Проверяем email и записываем ошибку при необходимости
      errors.email = form.email.includes("@") ? "" : "Некорректный email"
    }

    function validatePassword() {
      // Простая проверка длины пароля
      errors.password =
        form.password.length >= 6 ? "" : "Минимальная длина 6 символов"
    }

    function submit() {
      // Перед отправкой формы запускаем валидацию
      validateEmail()
      validatePassword()
      if (!isValid.value) return

      console.log("Отправляем данные", form)
    }

    return {
      form,
      errors,
      isValid,
      validateEmail,
      validatePassword,
      submit,
    }
  },
}

В шаблоне изменение form.email автоматически приводит к пересчету isValid и, например, дизейблу кнопки.

Фильтрация и сортировка списков

Еще один типичный пример — списки и таблицы:

import { reactive, ref, computed } from "vue"

export default {
  setup() {
    // Здесь мы создаем исходный список
    const state = reactive({
      items: [
        { id: 1, name: "John", age: 30 },
        { id: 2, name: "Anna", age: 25 },
        { id: 3, name: "Mike", age: 35 },
      ],
    })

    // Здесь мы создаем критерии фильтрации и сортировки
    const search = ref("")
    const sortBy = ref("name") // name или age
    const sortDir = ref("asc") // asc или desc

    const filteredAndSorted = computed(() => {
      const term = search.value.toLowerCase()

      let result = state.items.filter(item =>
        item.name.toLowerCase().includes(term),
      )

      result = result.slice().sort((a, b) => {
        const field = sortBy.value
        if (a[field] < b[field]) return sortDir.value === "asc" ? -1 : 1
        if (a[field] > b[field]) return sortDir.value === "asc" ? 1 : -1
        return 0
      })

      return result
    })

    return {
      state,
      search,
      sortBy,
      sortDir,
      filteredAndSorted,
    }
  },
}

Как только пользователь вводит текст или меняет режим сортировки, filteredAndSorted пересчитывается автоматически, и таблица обновляется без дополнительных вызовов.


Типичные ошибки и подводные камни

Реактивность упрощает жизнь, но вносит и свои нюансы. Здесь я покажу вам частые проблемы и как их избежать.

Потеря реактивности при деструктуризации

Во Vue, если вы деструктурируете reactive-объект, вы теряете реактивность полей:

import { reactive } from "vue"

const state = reactive({ count: 0 })

// Плохо - count больше не реактивен
const { count } = state

count++ // Vue не увидит изменение

Как решать:

  • использовать toRefs или toRef;
  • или использовать ref для отдельных значений изначально.
import { reactive, toRefs } from "vue"

const state = reactive({ count: 0 })

// Правильно - count остается реактивным
const { count } = toRefs(state)

// Теперь изменение count.value будет реактивным
count.value++

Комментарии в коде помогают здесь явно показать, что происходит с реактивностью.

Мутация исходных данных «в обход» реактивной системы

Иногда разработчики пытаются напрямую изменять вложенные объекты, которые не были сделаны реактивными.

const user = {
  name: "Alex",
}

// Здесь мы просто присваиваем объекту user реактивное поле profile
state.user = user

// А потом меняем user.name напрямую
user.name = "John" // Vue не узнает об этом изменении

Лучший подход — изначально оборачивать данные в reactive или ref, а не хранить «сырые» объекты, которые вы потом мутируете где‑то еще.

Неочевидные зависимости в computed

Иногда вы случайно используете внутри computed не реактивную переменную, а внешнюю, и ожидаете, что computed будет обновляться. Но он не обновится, потому что зависимость не была зарегистрирована.

import { ref, computed } from "vue"

let external = 1 // Нереактивная переменная

export default {
  setup() {
    // Здесь мы создаем реактивную переменную count
    const count = ref(0)

    const total = computed(() => {
      // Здесь external не реактивен - изменение external
      // не вызовет пересчет total
      return count.value + external
    })

    return {
      count,
      total,
    }
  },
}

Если вы хотите, чтобы external влиял на реактивную систему, его нужно сделать реактивным (ref или reactive).


Как реализовать свою маленькую реактивную систему

Чтобы лучше почувствовать концепцию, полезно однажды написать минималистичную реализацию. Давайте сделаем простой пример на JS.

Реактивные переменные и эффекты

// Глобальная структура зависимостей
// target -> key -> Set<effect>
const targetMap = new WeakMap()

let activeEffect = null

function effect(fn) {
  // Здесь мы создаем обертку над функцией
  const wrapper = () => {
    activeEffect = wrapper          // Устанавливаем текущий эффект
    fn()                            // Выполняем функцию - она прочитает реактивные значения
    activeEffect = null             // Сбрасываем активный эффект
  }
  wrapper()
}

// Функция трекинга зависимостей
function track(target, key) {
  if (!activeEffect) return

  let depsMap = targetMap.get(target)
  if (!depsMap) {
    depsMap = new Map()
    targetMap.set(target, depsMap)
  }

  let dep = depsMap.get(key)
  if (!dep) {
    dep = new Set()
    depsMap.set(key, dep)
  }

  dep.add(activeEffect) // Регистрируем текущий эффект как зависимость
}

// Функция триггера зависимостей
function trigger(target, key) {
  const depsMap = targetMap.get(target)
  if (!depsMap) return

  const dep = depsMap.get(key)
  if (!dep) return

  dep.forEach(effect => effect())   // Вызываем все эффекты
}

// Реализация reactive через Proxy
function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      const result = Reflect.get(target, key, receiver)
      track(target, key)            // Регистрируем зависимость
      return result
    },
    set(target, key, value, receiver) {
      const oldValue = target[key]
      const result = Reflect.set(target, key, value, receiver)
      if (!Object.is(oldValue, value)) {
        trigger(target, key)        // Вызываем эффекты при изменении
      }
      return result
    },
  })
}

// Здесь мы создаем реактивный объект state
const state = reactive({ count: 0 })

// Регистрируем эффект
effect(() => {
  console.log("Счетчик:", state.count)
})

// Меняем значение - эффект вызовется снова
state.count++  // Выведет "Счетчик: 1"
state.count++  // Выведет "Счетчик: 2"

Этот код, конечно, упрощен по сравнению с Vue или MobX, но он демонстрирует, как связаны:

  • Proxy;
  • глобальный стэк эффектов;
  • таблица зависимостей.

Практические рекомендации по работе с реактивными переменными

Старайтесь держать состояние ближе к месту использования

Чем меньше «глобальных» реактивных переменных, тем проще отлаживать код. Реактивность удобнее всего, когда:

  • состояние компонента живет в самом компоненте;
  • общие данные выносятся в отдельный store (например, Pinia, Redux, MobX-stores);
  • вы явно контролируете, какой компонент от чего зависит.

Разделяйте «сырые» данные и производные

Хорошая практика — думать о состоянии как о трех слоях:

  1. Базовые данные (то, что приходит с сервера, вводит пользователь).
  2. Локальные настройки (фильтры, режимы сортировки, переключатели).
  3. Производные значения (фильтрованные, отсортированные, агрегированные данные).

Для слоя 3 всегда используйте computed (или аналог в вашем фреймворке). Это:

  • делает код более декларативным;
  • уменьшает количество багов из серии «забыли где‑то обновить значение».

Осторожнее с побочными эффектами

Иногда хочется внутри computed или реактивного выражения сделать запрос на сервер или изменить что‑то еще в состоянии. Лучше этого избегать.

Рекомендация:

  • computed и реактивные выражения — только про вычисления без побочных эффектов;
  • побочные эффекты (запросы, логирование, таймеры) — через специальные механизмы (watch, useEffect, onMount и т.п.).

Заключение

Реактивные переменные — это фундаментальная концепция, вокруг которой строятся современные фреймворки. Изменение значения автоматически обновляет все, что от него зависит. За этим стоит механизм:

  • отслеживания чтений реактивных данных;
  • регистрации зависимостей (эффектов, компонентов, вычислений);
  • повторного запуска этих эффектов при изменении значений.

Вы увидели, как это выглядит во Vue (ref, reactive, computed), как аналогичные идеи проявляются в Svelte и React, и какими паттернами удобно пользоваться в реальных задачах: формы, фильтрация, производные значения.

Понимание того, как устроена реактивность под капотом, помогает:

  • писать более предсказуемый код;
  • избегать скрытых зависимостей и «магии»;
  • эффективнее использовать возможности фреймворка, а не бороться с ним.

Частозадаваемые технические вопросы по теме и ответы

Как отследить изменение реактивной переменной и выполнить побочный эффект (запрос, лог)?

Во Vue используйте watch:

import { ref, watch } from "vue"

const count = ref(0)

// Здесь мы подписываемся на изменения count
watch(count, (newValue, oldValue) => {
  console.log("count изменился с", oldValue, "на", newValue)
  // Здесь можно выполнить запрос или другой побочный эффект
})

В React аналог — useEffect с зависимостью:

useEffect(() => {
  console.log("count изменился", count)
  // Здесь выполняем побочный эффект
}, [count])

Как сделать реактивной вложенную структуру (объект в объекте) во Vue 3?

reactive оборачивает объект целиком, включая вложенные объекты. Но если вы заменяете вложенный объект целиком, делайте это через само реактивное поле:

const state = reactive({
  user: { name: "Alex", profile: { city: "London" } },
})

// Правильно - меняем через state.user.profile
state.user.profile.city = "Paris"

// Если нужно заменить профиль целиком
state.user.profile = { city: "Berlin" } // Это тоже реактивно

Проблемы чаще возникают, когда вы храните вне реактивного состояния ссылку на вложенный объект и мутируете его напрямую. Старайтесь работать через исходный reactive-объект.

Как в Svelte отреагировать на изменение одной переменной и пересчитать другую без ручного вызова функции?

Используйте реактивные метки:

<script>
  let count = 0

  // Здесь мы задаем зависимость: double всегда равно count * 2
  $: double = count * 2

  // Если нужно выполнить побочный эффект:
  $: if (count > 10) {
    console.log("count больше 10")
  }
</script>

Метка $: говорит компилятору: «пересчитывай этот фрагмент кода каждый раз, когда меняются использованные в нем переменные».

Как в React сделать вычисляемое значение, похожее на computed из Vue?

Самый простой способ — использовать useMemo:

import { useState, useMemo } from "react"

function Component() {
  const [price, setPrice] = useState(100)
  const [quantity, setQuantity] = useState(2)

  // Здесь мы создаем "вычисляемое" значение total
  const total = useMemo(() => {
    return price * quantity
  }, [price, quantity]) // Зависимости

  // total будет пересчитываться только при изменении price или quantity
  ...
}

Важно не путать useMemo (кэширование вычислений) с useEffect (побочные эффекты).

Как отладить, какие реактивные переменные заставляют компонент перерендериваться?

Подход зависит от фреймворка:

  • Vue — используйте Vue Devtools, вкладка Component / Pinia, где видны реактивные поля и события изменений.
  • React — React DevTools, включите Highlight updates, чтобы видеть, какие компоненты перерисовываются.
  • Svelte — Svelte Devtools, можно смотреть состояние и реактивные выражения.

На уровне кода полезно временно добавлять console.log в computed, эффекты и обработчики, чтобы понять, какие значения действительно меняются и что запускает обновление.

Стрелочка влевоРеактивные объекты reactive-objects - подробное руководство с примерамиМеханизм Provide Inject - как он работает и когда применятьСтрелочка вправо

Постройте личный план изучения Vue до уровня Middle — бесплатно!

Vue — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Vue

Руководство по валидации форм во Vue.jsИнтеграция Tiptap для создания редакторов на VueРабота с таблицами во Vue через TanStackИнструкция по установке и компонентам Vue sliderУправление пакетами Vue js с помощью npmУправление пакетами и node modules в Vue проектахКак использовать meta для улучшения SEO на VueПолный гайд по компоненту messages во Vuejs5 правил использования Inertia с Vue и LaravelРабота с модулями и пакетами в VueИнструкция по работе с grid на VueGithub для Vue проектов - подробная инструкция по хранению и совместной работеНастройка ESLint для Vue проектов и поддержка качества кодаОбработка ошибок и отладка в Vue.jsИспользование Vue Devtools для отладки и мониторинга приложенийРабота с конфигурационными файлами и скриптами VueСоздание и настройка проектов Vue с помощью Vue CLI3 способа интеграции Chart.js с Vue для создания графиковРабота с Canvas во VueИнструкция по реализации календаря во VueРабота с Ant Design Vue для создания UI на Vue
Vuex - полное руководство по управлению состоянием во Vue приложенияхРеактивные ссылки ref - полный разбор для разработчиковРеактивные объекты reactive-objects - подробное руководство с примерамиРеактивные переменные - концепция reactive и практические примерыМеханизм Provide Inject - как он работает и когда применятьPinia современный менеджер состояния для VueЛокальное состояние local state в веб разработкеГлобальное состояние в приложениях - global state
Обзор и использование утилит Vue для удобной разработкиРабота с обновлениями компонента и жизненным циклом updateРазрешение конфликтов и ошибок с помощью Vue resolveИспользование query-параметров и их обработка в маршрутах VueЗагрузка и управление состоянием загрузки в VueИспользование библиотек Vue для расширения функционалаРабота с JSON данными в приложениях VueКак работать с экземплярами компонента Instance во VueПолучение данных и API-запросы во Vue.jsЭкспорт и импорт данных и компонентов в VueОбработка событий и их передача между компонентами VuejsГайд по defineEmits на Vue 3Понимание core функционала Vue и его применениеПонимание и применение Composition API в Vue 3Понимание и работа с компилятором VueКогда и как использовать $emit и call во VueВзаимодействие с внешними API через Axios в Vue
Веб приложения на Vue архитектура и лучшие практикиИспользование Vite для быстрого старта и сборки проектов на Vue 3Работа с URL и ссылками в приложениях на VueРабота с пользовательскими интерфейсами и UI библиотеками во VueОрганизация и структура исходных файлов в проектах VueИспользование Quasar Framework для разработки на Vue с готовыми UI-компонентамиОбзор популярных шаблонов и стартовых проектов на VueИнтеграция Vue с PHP для создания динамичных веб-приложенийКак организовать страницы и маршруты в проекте на VueNuxt JS и Vue 3 для SSR приложенийСоздание серверных приложений на Vue с помощью Nuxt jsИспользование Vue Native для разработки мобильных приложенийОрганизация и управление индексной страницей в проектах VueИспользование Docker для контейнеризации приложений на VueИнтеграция Vue.js с Django для создания полноценных веб-приложенийСоздание и работа с дистрибутивом build dist Vue приложенийРабота со стилями и CSS в Vue js для красивых интерфейсовСоздание и структурирование Vue.js приложенияКак исправить ошибку cannot find module vueНастройка и сборка проектов Vue с использованием современных инструментовИнтеграция Vue с Bitrix для корпоративных решенийРазработка административных панелей на Vue js
Отображение компонента mounted - практическое руководствоФункция append в Go GolangХуки жизненного цикла компонентов - полное руководство для разработчиковУничтожение компонента destroyed - как правильно очищать ресурсы и подпискиИнициализация данных в состоянии created - как и когда подготавливать данные в приложенииОбновление компонента beforeUpdate во VueРазрушение компонента во Vue - beforeDestroy и beforeUnmountСоздание экземпляра beforeCreate - полный разбор жизненного циклаМонтирование компонента - хук beforeMount в Vue
5 библиотек для создания tree view во VueИнтеграция Tailwind CSS с Vue для современных интерфейсовИнтеграция Vue с серверной частью и HTTPS настройкамиКак обрабатывать async операции с Promise во VueИнтеграция Node.js и Vue.js для разработки приложенийРуководство по интеграции Vue js в NET проектыПримеры использования JSX во VueГайд по импорту и регистрации компонентов на VueМногоязычные приложения на Vue с i18nИнтеграция FLIR данных с Vue5 примеров использования filter во Vue для упрощения разработки3 примера реализации drag-and-drop во Vue
Наблюдатели watchers - от паттерна до практических реализацийУправление переменными и реактивными свойствами во VueИспользование v for и slot в VueУправление пользователями и их данными в Vue приложенияхПрименение v-bind для динамической привязки атрибутов в VueСоздание и использование UI Kit для Vue приложенийТипизация и использование TypeScript в VuejsШаблоны Vue templates - практическое руководство для разработчиковИспользование шаблонов в Vue js для построения интерфейсовИспользование Swiper для создания слайдеров в VueРабота со стилями и стилизацией в VueСтруктура и особенности Single File Components SFC в VueРабота со SCSS в проектах на Vue для стилизацииРабота со скроллингом и прокруткой в Vue приложенияхПрименение script setup синтаксиса в Vue 3 для упрощения компонентовИспользование scoped стилей для изоляции CSS в компонентах Vue3 способа улучшить навигацию Vue с push()Обработка запросов и асинхронных операций в VueРеактивность Vue reactivity - как это работает под капотом и как этим пользоватьсяПонимание и использование provide inject для передачи данных между компонентамиПередача и использование props в Vue 3 для взаимодействия компонентовПередача данных между компонентами с помощью props в Vue jsУправление property и функциями во Vue.jsРабота со свойствами компонентов VueУправление параметрами и динамическими данными во VueОпции компонента в Go - паттерн component-optionsРабота с lifecycle-хуком onMounted во VueОсновы работы с объектами в VueПонимание жизненного цикла компонента Vue js на примере mountedИспользование модальных окон modal в Vue приложенияхИспользование методов в компонентах Vue для обработки логикиИспользование метода map в Vue для обработки массивовИспользование хуков жизненного цикла Vue для управления состоянием компонентаРабота с ключами key в списках и компонентах VueОбработка пользовательского ввода в Vue.jsРабота с изображениями и их оптимизация в VueИспользование хуков жизненного цикла в VueОрганизация сеток и гридов для верстки интерфейсов на VueСоздание и управление формами в VueОрганизация файлов и структура проекта Vue.jsКомпоненты Vue создание передача данных события и emitРабота с динамическими компонентами и данными в Vue3 способа манипулирования DOM на VueРуководство по div во VueИспользование директив в Vue и их расширенные возможностиОсновы и применение директив в VueИспользование директив и их особенности на Vue с помощью defineИспользование компонентов datepicker в Vue для выбора датОрганизация циклов и итераций во VueКак работает компиляция Vue CoreВычисляемые свойства computed во Vue.jsСоздание и использование компонентов в Vue JSОбработка кликов и пользовательских событий в VueИспользование классов в Vue для организации кода и компонентовИспользование директивы checked для управления состоянием чекбоксов в VueГайд на checkbox компонент во VueОтображение данных в виде графиков с помощью Vue ChartСоздание и настройка кнопок в VueСоздание и настройка кнопок в Vue приложенияхРабота с lifecycle-хуками beforeCreate и beforeMount во VueОсновы Vue - vue-basics для уверенного стартаИспользование массивов и методов их обработки в VueИспользование массивов и их обработка в Vue
Слоты компонента - концепция и практическое использованиеРегистрация компонентов component-registration в приложениях с внедрением зависимостейProps компонента в React - полный разбор с примерамиФункциональные компоненты в React - функциональный подход к построению интерфейсовСобытия компонента - events в современных интерфейсахДинамические компоненты - dynamic-componentsСоздание компонента component - практическое руководствоАсинхронные компоненты async-components - практическое руководство
Использование Vuetify для создания современных интерфейсов на VueИспользование transition во VueТестирование компонентов и приложений на VueТелепортация - архитектура и реализация в серверных приложенияхРабота с teleport для управления DOM во VueSuspense в React - управление асинхронными данными и ленивой загрузкойПять шагов по настройке SSR в VuejsИспользование Shadcn UI компонентов с Vue для продвинутых интерфейсовИспользование router-link для навигации в Vue RouterКак использовать require в Vue для динамического импорта модулейРабота с динамическим рендерингом и виртуальным DOM на Vue.jsИспользование ref для управления ссылками и реактивностью в Vue 3Использование Vue Pro и его преимущества для профессиональной разработкиПлагины Vue vue-plugins - полное практическое руководствоРуководство по nextTick для работы с DOMМиксины - mixins в современном программированииJSX в Vue с использованием плагина vue-jsxСоздание и использование компонентов с помощью Vue js и CУправление состоянием и реактивностью через inject и provideДинамическое обновление компонентов и данных на VueГлубокое изучение документации Vue и как эффективно её использоватьКастомные элементы - Custom Elements в современном JavaScriptИспользование Crystal с Vue для разработкиОптимизация производительности и предупреждения в VueИспользование вычисляемых свойств для динамического отображения данных на Vue js
Открыть базу знаний

Лучшие курсы по теме

изображение курса

Vue 3 и Pinia

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий