Single File Components (SFCs) in Vue.js are a powerful way to organize your Vue.js applications by encapsulating the template, script, and styles of a component into a single file with an .vue
extension. This makes it easier to manage and maintain your components, especially as they grow in complexity. Here's a detailed explanation along with code examples:
Anatomy of a Single File Component
A typical Single File Component consists of three main sections:
- Template: This section contains the HTML markup for the component's UI. It uses Vue's template syntax, which allows you to bind data and use directives.
- Script: This section contains the JavaScript code for the component. It includes the component's data, methods, lifecycle hooks, and any other logic.
- Styles: This section contains the component's CSS styles. You can use CSS preprocessors like Sass or Less, and scoped styles are also supported to prevent style leakage.
Example of a Single File Component
Let's create a simple Single File Component for a to-do list item.
<!-- TodoItem.vue -->
<template>
<div class="todo-item" @click="toggleCompleted">
<input type="checkbox" v-model="completed">
<span :class="{ 'completed': completed }">{{ text }}</span>
</div>
</template>
<script>
export default {
props: {
text: String,
completed: Boolean
},
methods: {
toggleCompleted() {
this.completed = !this.completed;
}
}
}
</script>
<style scoped>
.todo-item {
cursor: pointer;
margin-bottom: 5px;
}
.completed {
text-decoration: line-through;
}
</style>
Using the Single File Component
To use the TodoItem
component in your application, import it, and register it like any other Vue component. For example:
<!-- App.vue -->
<template>
<div id="app">
<h1>My Todo List</h1>
<TodoItem v-for="(item, index) in todoItems" :key="index" :text="item.text" :completed="item.completed" />
</div>
</template>
<script>
import TodoItem from './components/TodoItem.vue';
export default {
components: {
TodoItem
},
data() {
return {
todoItems: [
{ text: 'Learn Vue.js', completed: false },
{ text: 'Build something awesome', completed: true },
{ text: 'Celebrate', completed: false }
]
};
}
}
</script>
<style>
/* Global styles */
body {
font-family: Arial, sans-serif;
}
</style>
In this example, TodoItem.vue
is imported and registered as a component in App.vue
. It is then used within the template of App.vue
.
Benefits of Single File Components
- Encapsulation: Everything related to a component is in one place, making it easier to understand and maintain.
- Reusability: Components can be easily reused across different parts of your application.
- Scoped Styles: Styles defined within a Single File Component are scoped to that component, preventing global style conflicts.
- Tooling Support: Many build tools, such as Vue CLI, provide built-in support for Single File Components, including features like hot module replacement and code splitting.
Single File Components are a key feature of Vue.js that promotes a modular and maintainable approach to building web applications.