v-memo — это директива, предназначенная для оптимизации
производительности компонентов Vue, позволяющая кэшировать результат
рендера фрагментов шаблона. Она особенно полезна для больших или часто
перерисовываемых частей интерфейса, где повторный рендер не требуется
при неизменности входных данных.
Директива v-memo работает аналогично механизму
мемоизации функций: Vue запоминает сгенерированное виртуальное дерево
DOM и повторно использует его, если зависимые значения не
изменились.
Синтаксис:
<div v-memo="[dependency1, dependency2]">
<!-- Контент, который кэшируется -->
</div>
v-memo должны быть реактивными,
чтобы Vue отслеживал их изменения.Пример 1. Кэширование списка элементов
<template>
<ul>
<li v-for="item in items" :key="item.id" v-memo="[item.id, item.value]">
{{ item.value }}
</li>
</ul>
</template>
<script setup>
import { ref } from 'vue';
const items = ref([
{ id: 1, value: 'Элемент 1' },
{ id: 2, value: 'Элемент 2' },
]);
</script>
В этом примере каждый элемент списка будет повторно использовать
кэшированный рендер, если его id и value не
изменяются. Это уменьшает количество операций обновления DOM при
изменении других частей компонента.
Пример 2. Кэширование сложного компонента
<template>
<HeavyChart v-memo="[chartData]" :data="chartData" />
</template>
<script setup>
import { ref } from 'vue';
import HeavyChart from './HeavyChart.vue';
const chartData = ref(fetchInitialData());
</script>
Здесь компонент HeavyChart будет перерендериваться
только при изменении объекта chartData. Это особенно
актуально для визуализаций с большим объемом данных, где рендер может
занимать значительное время.
v-memo работает только на фрагментах
шаблона, не на отдельных свойствах компонента.reactive или ref; служит именно для
оптимизации рендера.v-for, v-if и другими
директивами Vue, но необходимо корректно управлять ключами
(:key) для точного отслеживания изменений.computed кэширует значения вычислений,
а v-memo кэширует рендер компонента.watch отслеживает изменения и позволяет выполнять
побочные эффекты, в то время как v-memo не вызывает
побочных действий, а только оптимизирует DOM.Использование v-memo позволяет избежать лишних
перерасчётов и рендеров, сохраняя реактивность и корректность
интерфейса.
v-memo и :key для точного контроля
обновлений.v-memo снижает
нагрузку на виртуальный DOM.