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

Как отключить реактивность объекта?

2.0 Middle🔥 141 комментариев
#JavaScript Core

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

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

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

Отключение реактивности объекта

Этот вопрос относится к Vue.js реактивной системе. Существует несколько способов отключить реактивность для оптимизации производительности.

Использование shallowRef

Для отключения глубокой реактивности используйте shallowRef, который отслеживает только изменение самого ref, но не вложенных свойств.

import { shallowRef } from "vue";

const state = shallowRef({
  user: { name: "John", age: 30 },
  settings: { theme: "dark" }
});

// Это вызовет обновление (замена объекта)
state.value = { user: { name: "Jane" }, settings: {} };

// Это НЕ вызовет обновление (изменение вложенного свойства)
state.value.user.name = "Jane";

Использование shallowReactive

Аналог shallowRef для reactive, отключает реактивность вложенных объектов.

import { shallowReactive } from "vue";

const state = shallowReactive({
  count: 0,
  nested: { value: 10 }
});

// Вызовет обновление
state.count++;

// НЕ вызовет обновление
state.nested.value = 20;

Использование Object.freeze

Замораживание объекта предотвращает его изменение и отключает реактивность Vue.

import { reactive } from "vue";

const data = Object.freeze({
  name: "John",
  age: 30
});

const state = reactive(data);

// При попытке изменить свойство ничего не произойдёт
state.name = "Jane"; // Игнорируется

Использование markRaw

Функция markRaw полностью отключает реактивность для объекта и его вложенной структуры.

import { reactive, markRaw } from "vue";

const complexObject = markRaw({
  data: [1, 2, 3],
  nested: { value: 100 }
});

const state = reactive({ complex: complexObject });

// Никакие изменения не вызовут обновление
state.complex.data[0] = 999;
state.complex.nested.value = 200;

Выбор правильного подхода

  • markRaw — для больших объектов данных, которые не должны быть реактивными вообще (напр., данные из external библиотек)
  • shallowRef / shallowReactive — когда нужна реактивность только на верхнем уровне
  • Object.freeze — для data, которые не должны изменяться вообще
  • Обычный ref/reactive — для стандартной полной реактивности

Оптимизируя реактивность, можно значительно улучшить производительность приложения, особенно при работе с большими объёмами данных.

Как отключить реактивность объекта? | PrepBro