← Назад к вопросам

Как работает реактивность во Vue2?

2.0 Middle🔥 121 комментариев
#Vue.js

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как работает реактивность во Vue 2

Реактивность - это система Vue, которая автоматически обновляет UI при изменении данных. Vue отслеживает изменения в объектах и массивах.

Основные концепции

1. Reactive Data Binding Vue преобразует свойства data в реактивные при создании компонента:

data() {
  return {
    message: 'Hello', // Vue отследит изменения
    count: 0
  }
},

methods: {
  increment() {
    this.count++; // Триггерит re-render
  }
}

2. Dependency Tracking (отслеживание зависимостей) Vue использует Observer pattern для отслеживания зависимостей:

computed: {
  fullName() {
    // Отслеживаются firstName и lastName
    return this.firstName + ' ' + this.lastName;
  }
},

watch: {
  'firstName': function(newVal, oldVal) {
    console.log('First name changed');
  }
}

3. Object.defineProperty для Getters/Setters Vue использует Object.defineProperty (внутренний механизм):

// Упрощённо:
function defineReactive(obj, key, value) {
  Object.defineProperty(obj, key, {
    get() {
      console.log(`Getting ${key}`);
      return value;
    },
    set(newValue) {
      if (newValue !== value) {
        console.log(`Setting ${key} to ${newValue}`);
        value = newValue;
        // Оповещаем зависимые компоненты
        dep.notify();
      }
    }
  });
}

4. Computed Properties (вычисляемые свойства) Кэшируют результаты и пересчитываются только при изменении:

computed: {
  reversedMessage() {
    return this.message.split('').reverse().join('');
  }
}

5. Watchers (наблюдатели) Реагируют на изменения и выполняют код:

watch: {
  message(newVal, oldVal) {
    console.log(`Message changed`);
  },

  'user.profile': {
    handler(newVal) {
      console.log('Profile changed:', newVal);
    },
    deep: true
  },

  count: {
    handler(newVal) {
      console.log('Count is now:', newVal);
    },
    immediate: true
  }
}

Как работает update process

// 1. Изменяем данные
this.count++; // Вызывается setter

// 2. Vue добавляет компонент в очередь (batching)

// 3. Vue пересчитывает новый VDOM

// 4. Vue сравнивает старый VDOM с новым (diffing)

// 5. Vue обновляет реальный DOM

// 6. Компонент перерисовывается

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

// Проблема: Vue не отслеживает добавление новых свойств
const user = {name: 'John'};
user.email = 'john@example.com'; // НЕ реактивно!

// Решение: используй Vue.set
Vue.set(user, 'email', 'john@example.com');
this.$set(user, 'email', 'john@example.com');

// Проблема: изменение элементов массива по индексу
const items = [1, 2, 3];
items[0] = 5; // НЕ отследит!

// Решение: используй splice
items.splice(0, 1, 5);
Vue.set(items, 0, 5);

Пример компонента

export default {
  data() {
    return {
      firstName: 'John',
      lastName: 'Doe',
      count: 0
    }
  },

  computed: {
    fullName() {
      return this.firstName + ' ' + this.lastName;
    }
  },

  watch: {
    count(newVal) {
      if (newVal > 10) alert('Count is too high!');
    }
  },

  methods: {
    increment() {
      this.count++; // Триггерит re-render
    }
  }
}

Производительность

// Плохо: вычисление в template каждый раз
<div>{{ items.filter(i => i.active).length }}</div>

// Хорошо: computed property кэшируется
computed: {
  activeCount() {
    return this.items.filter(i => i.active).length;
  }
}
<div>{{ activeCount }}</div>

Реактивность Vue - мощный инструмент для создания интерактивных приложений без ручного обновления DOM.