Поиск по сайту
Ctrl + K
Вопросы по Vue

В чем разница между shallowRef и markRaw в Vue 3?

Vue 3 introduced various ways to handle reactivity, and two useful functions are shallowRef и markRaw. Давайте разберемся, чем они отличаются и в каких случаях их следует использовать.

shallowRef

shallowRef создает реактивную ссылку на объект, но делает это "поверхностно". Это означает, что Vue будет отслеживать только саму ссылку и изменения на верхнем уровне, но не будет рекурсивно отслеживать вложенные свойства этого объекта.

Пример использования shallowRef:

import { shallowRef } from 'vue'

const state = shallowRef({
  count: 0,
  user: {
    name: 'Алекс',
    age: 25,
  }
});

// Изменения в user не будут реактивными.
state.value.user.name = 'Иван'; // Изменение не будет отслеживаться

// Однако изменения на верхнем уровне будут реактивными
state.value.count++; // Это изменение будет отслеживаться

markRaw

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

Пример использования markRaw:

import { markRaw, reactive } from 'vue'

const nonReactiveObject = markRaw({
  key: 'value'
});

const state = reactive({
  item: nonReactiveObject
});

// Изменения в nonReactiveObject не будут реактивными
state.item.key = 'новое значение'; // Изменение не будет отслеживаться

Когда использовать?

  • Используйте shallowRef, если вам нужно создать реактивную ссылку, но без глубокого отслеживания вложенных свойств. Это может ускорить производительность, если у вас есть глубокие объекты и вам важна только реактивность верхних уровней.
  • Используйте markRaw, если у вас есть объект, который не должен быть реактивным. Это хорошо подходит для объектов, которые будут переданы как пропсы в компоненты или храниться в состоянии, но вам не нужно, чтобы Vue следил за их изменениями.

Заключение

Обе функции, shallowRef и markRaw, предоставляют разработчикам гибкость в управлении реактивностью в Vue 3. Понимание их различий поможет вам лучше контролировать поведение вашего приложения и обеспечивать высокую производительность.

Содержание:
Редактировать