В Vue.js директива v-once предназначена для оптимизации
производительности путем однократного рендеринга элемента или
компонента. Она позволяет фреймворку пропустить повторное отслеживание
изменений для указанного узла, что снижает нагрузку на систему при
работе с большими или статическими данными.
Директива v-once сообщает Vue, что содержимое элемента
не будет изменяться после первого рендеринга. Vue создаёт виртуальный
DOM для компонента один раз и не обновляет его при изменении реактивных
данных. Это особенно полезно для:
Синтаксис прост:
<p v-once>{{ message }}</p>
После первого рендеринга значение message будет
зафиксировано, и любые последующие изменения в переменной
message не повлияют на отображение этого элемента.
v-once можно использовать не только для отдельных
HTML-элементов, но и для компонентов:
<MyComponent v-once :data="staticData"></MyComponent>
В этом случае компонент будет смонтирован один раз, и Vue не будет
отслеживать изменения пропсов staticData. Важно учитывать,
что это не означает полное отключение реактивности внутри компонента —
только верхний уровень рендеринга будет зафиксирован.
v-once не реагирует на изменения реактивных
данных. Это может привести к устаревшему отображению, если данные
изменяются после первого рендера.v-once отдельно или
использовать динамическое управление состоянием.v-once для элементов, где
данные всё же могут изменяться, так как это приведёт к рассинхронизации
данных и интерфейса.<section>
<h1 v-once>Добро пожаловать на сайт</h1>
<p v-once>Эта информация не изменяется динамически.</p>
</section>
<ul>
<li v-for="item in staticList" :key="item.id" v-once>
{{ item.name }} - {{ item.description }}
</li>
</ul>
В этом случае Vue создаёт каждый <li> только один
раз, не отслеживая изменения в staticList, что значительно
снижает нагрузку на виртуальный DOM при большом количестве
элементов.
v-once можно использовать совместно с v-if
и v-for, но необходимо учитывать порядок применения:
<div v-if="showContent">
<p v-once>{{ staticMessage }}</p>
</div>
В этом примере содержимое <p> рендерится только
один раз, когда условие showContent истинно. Если условие
изменится и элемент будет снова показан, директива v-once
сработает повторно для нового DOM-узла.
v-once для элементов и компонентов,
которые гарантированно не изменяются после первого рендера.v-memo (Vue 3.3+) или вычисляемые свойства, для повышения
производительности больших приложений.v-once является простым, но мощным инструментом
оптимизации. Он снижает количество перерендеров, экономит ресурсы
браузера и ускоряет отображение статического контента, что особенно
важно в масштабных приложениях с большим количеством компонентов.