Спецификация синтаксиса SFC
Обзор
Однофайловый компонент Vue (SFC), условно использующий расширение файла *.vue, — это пользовательский формат файла, который использует HTML-подобный синтаксис для описания компонента Vue. Vue SFC синтаксически совместим с HTML.
Каждый файл *.vue состоит из трёх типов блоков верхнего уровня: <template>, <script> и <style>, а также из дополнительных пользовательских блоков:
vue
<template>
<div class="example">{{ msg }}</div>
</template>
<script>
export default {
data() {
return {
msg: 'Привет, мир!'
}
}
}
</script>
<style>
.example {
color: red;
}
</style>
<custom1>
Это может быть, например, документация по компоненту.
</custom1>Языковые блоки
<template>
Каждый файл
*.vueможет содержать не более одного блока верхнего уровня<template>.Содержимое будет извлечено и передано в
@vue/compiler-dom, предварительно скомпилировано в рендер-функции JavaScript и присоединено к экспортируемому компоненту в качестве его опцииrender.
<script>
Каждый файл
*.vueможет содержать не более одного блока<script>(за исключением<script setup>).Сценарий выполняется как модуль ES.
Экспорт по умолчанию должен представлять собой объект
optionsкомпонента Vue, либо как обычный объект, либо как возвращаемое значение defineComponent.
<script setup>
Каждый файл
*.vueможет содержать не более одного блока<script setup>(не считая обычных<script>).Скрипт предварительно обрабатывается и используется в качестве функции
setup()компонента, что означает, что он будет выполняться для каждого экземпляра компонента. Связки верхнего уровня в<script setup>автоматически передаются шаблону. Более подробную информацию можно найти в специальной документации по<script setup>.
<style>
Один файл
*.vueможет содержать несколько тегов<style>.Тег
<style>может иметь атрибутыscopedилиmodule(подробнее см. в Особенности CSS SFC), чтобы помочь инкапсулировать стили для текущего компонента. В одном компоненте можно смешивать несколько тегов<style>с разными режимами инкапсуляции.
Пользовательские блоки
В файл *.vue можно включить дополнительные пользовательские блоки для любых специфических нужд проекта, например, блок <docs>. Некоторые реальные примеры пользовательских блоков включают в себя:
Работа с пользовательскими блоками зависит от инструментария — если вы хотите создать собственные интеграции пользовательских блоков, смотрите раздел Интеграция пользовательских блоков SFC для более подробной информации.
Автоматический вывод имени
SFC автоматически выводит имя компонента из его имени файла в следующих случаях:
- Форматирование предупреждений при разработке
- Проверка DevTools
- Рекурсивная ссылка на себя, например, файл с именем
FooBar.vueможет ссылаться на себя как<FooBar/>в своем шаблоне. Это имеет более низкий приоритет, чем явно зарегистрированные/импортированные компоненты.
Препроцессоры
Блоки могут объявлять языки препроцессора с помощью атрибута lang. Самый распространённый случай — использование TypeScript для блока <script>:
template
<script lang="ts">
// используем TypeScript
</script>lang можно применить к любому блоку — например, мы можем использовать <style> с Sass и <template> с Pug:
template
<template lang="pug">
p {{ msg }}
</template>
<style lang="scss">
$primary-color: #333;
body {
color: $primary-color;
}
</style>Обратите внимание, что интеграция с различными препроцессорами может отличаться в зависимости от набора инструментов. Примеры смотрите в соответствующей документации:
Импорт через атрибут src
Если вы предпочитаете разделять компоненты *.vue на несколько файлов, вы можете использовать атрибут src для импорта внешнего файла для языкового блока:
vue
<template src="./template.html"></template>
<style src="./style.css"></style>
<script src="./script.js"></script>Импорт src подчиняется тем же правилам разрешения путей, что и запросы модулей webpack, что означает:
- Относительные пути должны начинаться с
./. - Можно импортировать ресурсы из зависимостей npm:
vue
<!-- импортируйте файл из установленного пакета npm "todomvc-app-css" -->
<style src="todomvc-app-css/index.css" />Импорт src также работает с пользовательскими блоками, например:
vue
<unit-test src="./unit-test.js">
</unit-test>Примечание
При использовании псевдонимов в src не начинайте с ~ — всё, что следует за ним, интерпретируется как запрос модуля. Это означает, что вы можете ссылаться на ресурсы внутри узловых модулей:
vue
<img src="~some-npm-package/foo.png">Комментарии
Внутри каждого блока вы должны использовать синтаксис комментария, соответствующий используемому языку (HTML, CSS, JavaScript, Pug и т. д.). Для комментариев верхнего уровня используйте синтаксис комментариев HTML: <!-- содержимое комментария здесь -->