1. 混合式模板
SFC 允许您将 HTML、CSS 和 JavaScript 组合到一个文件中。通过使用包含 name
属性的 <template>
部分,您可以指定外部 HTML 模板文件。这可以使您将模板逻辑与组件的其他部分分开,从而提高可维护性。
<template src="./my-template.html"></template>
2. 指定 CSS 隔离
为了避免 CSS 样式泄露到其他组件中,SFC 引入了 CSS 隔离功能。您可以使用 scoped
属性将 CSS 样式限制在组件内部。
<style scoped>
/* 这个样式只适用于这个组件 */
</style>
3. 动态组件
动态组件允许您基于运行时数据呈现不同的组件。SFC 提供了 is
属性,它可以接受一个组件名称或组件对象,从而允许您动态切换组件。
<component :is="currentComponent"></component>
4. 自定义事件处理
SFC 允许您定义自定义事件,这些事件可以在组件外部触发。使用 v-on
指令,您可以将事件处理函数绑定到组件上的特定事件。
<template>
<button @click="handleMyEvent">Click Me</button>
</template>
<script>
export default {
methods: {
handleMyEvent() {
// ...
}
}
}
</script>
5. 异步数据加载
SFC 可以与 Vuex 集成,使您能够在组件挂载时异步加载数据。通过使用 asyncData
钩子,您可以从服务器或其他数据源获取数据,然后在组件呈现之前将其存储在组件状态中。
export default {
asyncData() {
// 加载异步数据并返回 Promise
}
}
6. 单个文件部署
SFC 可以打包成单个 JavaScript 文件,其中包含所有必要的 HTML、CSS 和 JavaScript 代码。这可以简化部署并提高应用程序性能。
7. 代码分割
对于大型应用程序,SFC 支持代码分割,这是一种将应用程序代码拆分成较小块的技术。这可以减少初始加载时间,并按需加载组件。
export default {
name: "MyComponent",
components: {
// 异步加载子组件
"my-child-component": () => import("./MyChildComponent.vue")
}
}
8. Typescript 支持
SFC 与 TypeScript 完全兼容。您可以使用 TypeScript 类型注解和接口来提高代码质量和可维护性。
export default {
props: {
message: {
type: String,
required: true
}
}
}
9. 插槽
插槽是一种允许您在组件内部呈现用户提供内容的机制。SFC 提供了 <slot>
元素,用于指定插槽位置,以及 <slot>
插槽,用于将用户内容插入组件。
<template>
<div>
<h1>{{ header }}</h1>
<slot></slot>
</div>
</template>
10. 守卫
守卫是钩子函数,使您可以在特定生命周期事件(如组件创建、更新和卸载)之前或之后执行代码。SFC 支持以下守卫:
- beforeCreate
- created
- beforeMount
- mounted
- beforeUpdate
- updated
- beforeDestroy
- destroyed