0Pricing
Frontend Academy · 课时

Vue SFC:script、template 与 style

了解单文件组件格式:用于编写逻辑的 script 块、用于视图的 template 块,以及用于作用域 CSS 的 style 块。

Vue SFC:script、template 与 style 是 CoddyKit 上的免费 Frontend Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Frontend Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Frontend Academy 课程共包含 4 节课。

什么是单文件组件

Vue 单文件组件(SFC)是一个包含三个块的 .vue 文件:<script> 用于 JavaScript 逻辑,<template> 用于 HTML 视图,<style> 用于 CSS。一个组件所需的全部内容都位于同一个文件中。

<script setup lang="ts">
const greeting = 'Hello, Vue!';
</script>

<template>
  <h1>{{ greeting }}</h1>
</template>

<style scoped>
h1 { color: #42b883; }
</style>

script 块

逻辑、数据、导入内容和组合式 API 代码都写在这里。使用 <script setup> 时,在顶层声明的变量和导入内容会自动在模板中可用。

script setup——现代方式

<script setup> 是推荐使用的 SFC 语法。在其中声明的变量、计算属性和函数可以直接在模板中使用,无需显式返回。

<script setup lang="ts">
import { ref } from 'vue';

const count = ref(0);
function increment() { count.value++; }
</script>

<template>
  <button @click="increment">{{ count }}</button>
</template>

template 块

模板包含组件的 HTML 视图。Vue 模板会被编译为渲染函数。请在模板中使用 Vue 专用的属性和指令(条件渲染指令、列表渲染指令、@click)。

模板插值

使用双大括号 {{ }} 将响应式数据作为文本输出。Vue 会自动转义 HTML;如果要渲染 HTML,请谨慎使用 v-html 指令。

<template>
  <p>{{ message }}</p>
  <p>{{ count * 2 }}</p>
  <p>{{ isActive ? 'Active' : 'Inactive' }}</p>
</template>

style 块

style 块中的 CSS 会应用于该组件。添加 scoped 可以将样式限制为仅作用于此组件的元素,从而防止样式意外泄漏到全局。

<style scoped>
.card {
  border-radius: 8px;
  padding: 16px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
/* Without scoped: affects all .card elements globally */
</style>

作用域样式的工作原理

Vue 会为组件元素添加唯一的数据属性(例如 data-v-abc123),并重写作用域 CSS 选择器,使其包含该属性。这样可以确保样式只匹配此组件中的元素。

Vue 中的 CSS 模块

除了 scoped,还可以使用 <style module> 来实现 CSS 模块。在模板中通过 $style 对象访问类名。

<template>
  <div :class="$style.card">Content</div>
</template>

<style module>
.card { background: white; }
</style>

全局样式

未使用 scoped 的样式会全局生效。一种常见模式是:使用全局 app.css 存放基础样式和设计令牌,再为每个组件使用作用域样式编写组件专属规则。

SFC 中的 TypeScript

在 script 块中添加 lang="ts" 即可使用 TypeScript。Volar(官方 Vue IDE 扩展)为 Vue SFC 提供完整的 TypeScript 支持,包括经过类型检查的模板。

SFC 文件命名

对于在模板中使用的组件,请使用 PascalCase 命名 SFC 文件(UserProfile.vue)。Vue 建议使用多词名称,以避免与 HTML 元素发生冲突。

快速检查

Vue 的 <style> 块上的 scoped 属性有什么作用?

回顾:Vue 单文件组件

.vue 文件包含三个块:script(逻辑)、template(视图)和 style(CSS)。现代组合式 API 的写法是使用