В чем разница v-if и v-show во Vue
Что проверяют
Понимаете ли вы, что за двумя похожими директивами стоят разные механизмы: одна управляет существованием узла и компонента, другая только его видимостью. Следом обычно спрашивают, что станет с состоянием дочернего компонента при переключении и можно ли совмещать v-if с v-for.
Как отвечать
Начните с механики, выводы о производительности из неё следуют сами:
v-if: настоящий условный рендеринг. При ложном условии элемента в DOM нет, на его месте стоит комментарий-заглушка. Директива ленивая: если условие изначально ложно, ничего не рендерится и не монтируется. При переключении компонент уничтожается и создаётся заново, срабатываютonMountedиonUnmounted, локальное состояние теряется;v-show: элемент рендерится всегда, а директива переключает инлайновыйdisplay: none. Компонент остаётся смонтированным, его состояние и подписки живут;- цена: у
v-ifдорогое переключение и дешёвый старт при ложном условии, уv-showнаоборот. Отсюда правило: часто переключаемое (вкладки, выпадающее меню) черезv-show, редко меняющееся или тяжёлое черезv-if; - ограничения
v-show: не работает на<template>и не сочетается сv-else; v-ifиv-for: во Vue 3 уv-ifприоритет выше, поэтому условие не видит переменную цикла. Во Vue 2 было наоборот. Вешать их на один элемент не рекомендуется, фильтр лучше вынести вcomputed.
Если нужно и убрать компонент из DOM, и сохранить его состояние, назовите <KeepAlive>: он кеширует экземпляры при переключении динамических компонентов.
Где спотыкаются
Говорят, что v-if сбрасывает состояние «при каждом рендере». Сбрасывается оно только при смене условия, обычный перерендер родителя экземпляр не пересоздаёт.
Прячут через v-show тяжёлый блок, который пользователь может так и не открыть. Компонент всё равно смонтируется на старте, сделает запросы и займёт память.
Забывают про CSS: если в стилях элемента display задан с !important, инлайновый display: none от v-show его не перебьёт, и элемент не скроется.