Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 512новых вакансий за сутки·54 396вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 565
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 395 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 752
  • Облачные технологии6 631
  • QA вакансии2 183
  • Android1 322
  • Инженер данных860
  • Продакт-менеджер316

Разработка

  • iOS1 238
  • Backend вакансии1 196
  • AI вакансии549
  • Fullstack вакансии500
  • Frontend вакансии426
  • Mobile вакансии28

По стеку

  • Go5 209
  • Java3 131
  • Kotlin1 113
  • Node.js1 008
  • Rust833
  • .NET656
  • PHP322
  • C++270
  • C#207

DevOps и инфраструктура

  • Kubernetes3 882
  • Linux-инфраструктура2 817
  • DevOps вакансии2 655
  • Terraform / IaC2 191
  • Мониторинг и Observability1 071
  • CI/CD919
  • SRE308
  • Кибербезопасность38

Аналитика и данные

  • Аналитик данных522
  • Data Scientist435
  • Бизнес-аналитик397
  • Системный аналитик67

Другие направления

  • Проджект-менеджер109
  • UI/UX дизайн67
  • Ручное тестирование14

По регионам

  • Вакансии в США22 951
  • Вакансии в Европе10 259
  • Работа в России2 963
  • Вакансии в Канаде2 034

По формату

  • Удалённые вакансии39 691
  • Релокация в США22 951
  • Гибридная работа3 633
  • Офисная работа2 761

По уровню

  • Senior вакансии19 599
  • Middle вакансии11 130
  • Junior вакансии3 562

Сейчас нанимают

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis42 вакансии
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Vue.jsВсе вопросы
Vue.jsSeniorТеория

Как работает система реактивности Vue? Что изменилось между Vue 2 и Vue 3 (Proxy вместо Object.defineProperty)?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Vue 2 использовал Object.defineProperty, что не позволяло реагировать на добавление свойств и индексный доступ к массивам. Vue 3 перешёл на Proxy, который перехватывает все операции и устраняет эти ограничения. Внутренне это реализовано через track/trigger и ReactiveEffect.

Реактивность Vue 2: Object.defineProperty

В Vue 2 реактивность реализована через Object.defineProperty. При инициализации компонента Vue рекурсивно обходит все свойства объекта data и заменяет каждое геттером и сеттером. Когда вычитывается свойство во время рендера, текущий watcher добавляется в список подписчиков (dep). При записи — dep уведомляет все watchers.

// Упрощённая схема Vue 2
function defineReactive(obj, key, val) {
  const dep = new Dep();
  Object.defineProperty(obj, key, {
    get() {
      if (Dep.target) dep.depend(); // подписать watcher
      return val;
    },
    set(newVal) {
      val = newVal;
      dep.notify(); // уведомить всех
    }
  });
}

Ограничения Vue 2

  • Добавление новых свойств — не реактивно. this.obj.newProp = 1 не вызовет ре-рендер. Нужно Vue.set(this.obj, 'newProp', 1) или this.$set.
  • Удаление свойств — аналогично, нужен Vue.delete.
  • Индексы массива — this.arr[2] = 'x' не реактивно. Нужно Vue.set(this.arr, 2, 'x') или методы-мутаторы (push, splice, etc.) — Vue патчил их.
  • Производительность — при старте глубокий обход дерева объектов через defineProperty был дорогим для крупных объектов.

Реактивность Vue 3: Proxy

Vue 3 использует нативный Proxy, перехватывающий все операции над объектом — чтение (get), запись (set), удаление (deleteProperty), проверку (has), итерацию (ownKeys). Это устраняет все ограничения Vue 2.

import { reactive, effect } from '@vue/reactivity';

const state = reactive({ count: 0, items: [] });

effect(() => {
  // автоматически подписывается на все прочитанные свойства
  console.log('count:', state.count);
});

state.count++;          // effect запустится снова
state.newProp = 'x';    // тоже реактивно — Proxy перехватит set
delete state.count;     // deleteProperty — тоже отслеживается
state.items[0] = 'a';   // индексный доступ — работает
state.items.length = 0; // изменение length — работает

Внутренний механизм Vue 3

Система реактивности состоит из трёх слоёв:

  • reactive() / ref() — создают реактивные прокси. ref оборачивает примитивы в объект с .value.
  • track() / trigger() — функции из @vue/reactivity. track вызывается в геттере Proxy и записывает зависимость текущего active effect. trigger вызывается в сеттере и запускает все зависимые effects.
  • effect() / ReactiveEffect — базовый примитив (используется внутри computed, watch, рендер-функции компонента).
// Как устроен reactive() упрощённо
function reactive(target) {
  return new Proxy(target, {
    get(obj, key, receiver) {
      track(obj, key);       // записать зависимость
      return Reflect.get(obj, key, receiver);
    },
    set(obj, key, value, receiver) {
      const result = Reflect.set(obj, key, value, receiver);
      trigger(obj, key);     // уведомить effects
      return result;
    },
    deleteProperty(obj, key) {
      const result = Reflect.deleteProperty(obj, key);
      trigger(obj, key);
      return result;
    }
  });
}

ref vs reactive

  • ref(value) — для примитивов и любых значений. Доступ через .value в JS, авто-unwrap в шаблоне.
  • reactive(obj) — для объектов. Деструктуризация разрушает реактивность — нужен toRefs().

Подводные камни

  • Proxy не работает в IE11 — если нужна поддержка IE, Vue 2 или полифилл обязательны.
  • Деструктуризация реактивного объекта: const { count } = reactive({ count: 0 }) — count теряет реактивность. Всегда используйте toRefs() или оставляйте обращение через state.count.
  • Вложенные объекты в reactive() становятся реактивными лениво через Proxy, но сам объект не клонируется — мутация исходного объекта влияет на реактивное состояние.
  • Замена всего объекта: state = reactive(newObj) разрывает реактивную связь. Нужно Object.assign(state, newObj) или store.$patch(newObj) в Pinia.
  • ref в reactive-объекте авто-распаковывается: const s = reactive({ n: ref(0) }); s.n++ работает без .value — это удобно, но может запутать.
  • Шаллоу-версии (shallowRef, shallowReactive) не отслеживают вложенные свойства — используйте их только осознанно для оптимизации больших объектов.
  • markRaw(obj) исключает объект из системы реактивности навсегда. Передача такого объекта в reactive приведёт к предупреждению в DEV-режиме.

Частые вопросы на собеседовании

  • Что такое Pinia? Чем она отличается от Vuex и почему является рекомендованным менеджером состояния для Vue 3?
  • Что такое ref() и reactive() в Composition API? Когда использовать каждый?
  • В каких типах frontend-проектов Vue.js даёт реальный выигрыш, а где будет избыточен или неудачен?
  • В чём разница между вычисляемыми свойствами (computed properties) и watch'ерами? Когда использовать каждый?

Типичные ошибки

  • Считать, что Object.defineProperty всё ещё используется в Vue 3.
  • Мутировать сырой объект вместо реактивной обёртки и удивляться, что UI не обновился.
  • Деструктурировать reactive и терять реактивность без toRefs.
  • Полагаться на Vue.set — его в Vue 3 нет.

Что проверяет интервьюер

  • Знает, что в основе Vue 3 лежит Proxy с парой track/trigger.
  • Может описать роль planner/nextTick и пакетной обработки.
  • Понимает, почему добавление нового ключа работает в Vue 3 и не работало в Vue 2.
  • Упоминает shallowRef/markRaw как способ снять overhead глубокой реактивности.

Как вы знаете этот вопрос?

Проверить себя по теме Vue.js →

Источники

  • https://vuejs.org/guide/extras/reactivity-in-depth.html
  • https://vuejs.org/api/reactivity-core.html
Следующий вопрос→Что такое Pinia? Чем она отличается от Vuex и почему является рекомендованным менеджером состояния для Vue 3?

Связанные темы

Vue.jsperformance-debuggingreactivity-internalsvue-fundamentals