SFC и шаблонный синтаксис
↑ 4.1 Vue 3: основы, компоненты, Composition API · → Следующая
Зачем это на собесе
Базовый вопрос по Vue: из чего состоит компонент и как работает шаблон.
Объяснение
SFC (Single File Component) — .vue файл с блоками <template>, <script>/<script setup>, <style>.
<script setup lang="ts">
import { ref, computed } from "vue";
const props = defineProps<{ title: string }>();
const count = ref(0);
const doubled = computed(() => count.value * 2);
const html = "<b>текст</b>";
</script>
<template>
<section :class="{ active: count > 0 }" :style="{ color: 'red' }">
<h2>{{ props.title }} — {{ count }} ({{ doubled }})</h2>
<p v-html="html" /> <!-- опасно: только доверенный HTML -->
<button @click="count++">+1</button>
<span>{{ count > 5 ? "много" : "мало" }}</span>
</section>
</template>
<style scoped>
h2 { color: var(--primary); }
</style>Шаблонный синтаксис:
| Конструкция | Назначение |
|---|---|
{{ expr }} | интерполяция текста (экранируется) |
:attr="expr" (v-bind) | динамический атрибут/prop |
@event="handler" (v-on) | обработчик события |
v-model | двусторонняя привязка |
#slot (v-slot) | слоты |
| Выражения | одно JS-выражение без инструкций; доступ к ограниченному набору глобалей |
Шаблон компилируется в render-функции (на этапе сборки), при этом статические части поднимаются и помечаются для оптимизации (patch flags, hoisting, block tree).
<style scoped> изолирует стили (атрибут data-v-*), <style module> — CSS Modules, v-bind() в CSS привязывает стили к состоянию.
Несколько корней у шаблона поддерживаются (Vue 3, fragments).
Нюансы и подводные камни
v-htmlс пользовательскими данными — XSS.- В шаблоне доступны только объявленные привязки
<script setup>автоматически; в Options API — черезthis. - Сложную логику выносите из шаблона в
computed/функции. - Вызов методов в шаблоне выполняется при каждом рендере — используйте
computedдля дорогих операций. - Регистр атрибутов в DOM-шаблонах (не SFC) нечувствителен.
Практика
- Создайте компонент с интерполяцией, привязками, обработчиками и scoped-стилями.
- Посмотрите скомпилированный render в Vue SFC Playground.
- Замените вызов метода в шаблоне на
computed.
Вопросы с ответами
Что такое SFC?
Файл
.vue, объединяющий шаблон, логику и стили компонента.
Что делает scoped?
Ограничивает стили текущим компонентом, добавляя атрибут
data-v-*к элементам и селекторам.