Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。Vue 组件是 Vue 应用的核心,它们封装了可复用的逻辑和视图,使得开发大型应用变得更加简单和高效。在 Vue 3 中,组件的构成更加灵活和强大,主要得益于 Composition API 的引入。本文将详细介绍一个典型的 Vue 3 组件的各个部分,并通过一个完整的示例来展示如何构建一个功能完整的 Vue 3 组件。
1.模板(Template)
模板部分定义了组件的结构和布局,使用 HTML 语法和 Vue 的模板语法。模板中可以包含数据绑定、指令、事件处理等。
<template>
<div class="my-component">
<h1>{ { title }}</h1>
<button @click="handleClick">Click Me</button>
<slot></slot>
<slot name="footer"></slot>
</div>
</template>
在模板中:
- `{ { title }}`是数据绑定,用于动态显示响应式数据`title`。
- `@click="handleClick"`是事件绑定,用于监听按钮点击事件并调用`handleClick`方法。
2.脚本(Script)
在 Vue 3 中,脚本部分通常使用`defineComponent`和`setup`函数来定义组件的逻辑。`setup`函数是 Composition API 的核心,用于定义组件的响应式数据、计算属性、方法和生命周期钩子。
<script lang="ts">
import { defineComponent, ref, watch, onMounted, onUnmounted } from 'vue';
export default defineComponent({
name: 'MyComponent',
props: {
message: {
type: String,
required: true,
},
},
setup(props) {
// 响应式数据
const title = ref('Hello, Vue!');
// 计算属性
const reversedTitle = ref('');
watch(title, (newValue) => {
reversedTitle.value = newValue.split('').reverse().join('');
});
// 方法
function handleClick() {
alert('Button clicked!');
}
// 生命周期钩子
onMounted(() => {
console.log('Component mounted');
});
onUnmounted(() => {
console.log('Component unmounted');
});
// 返回响应式数据和方法
return {
title,
reversedTitle,
handleClick,
};
},
});
</script>
在脚本中:
- 使用`defineComponent`包裹组件逻辑,以提供更好的 TypeScript 支持。
- 使用`ref`创建响应式数据。
- 使用`watch`监听数据变化并执行逻辑。
- 使用`onMounted`和`onUnmounted`定义生命周期钩子。
- 返回一个对象,包含需要在模板中使用的响应式数据和方法。
3.样式(Style)
样式部分定义了组件的样式,可以使用 CSS、SCSS、LESS 等。样式可以是全局的,也可以是局部的(使用`scoped`属性)。
<style scoped>
.my-component {
color: blue;
}
</style>
在样式中:
- `scoped`属性确保样式只应用于当前组件,避免全局样式冲突。
4.属性(Props)
组件可以接收外部传入的数据,称为属性(props)。在`props`中定义的属性可以在组件内部使用。
props: {
message: {
type: String,
required: true,
},
},
5.插槽(Slots)
插槽允许父组件在子组件中插入内容,提供了更大的灵活性。可以使用具名插槽和默认插槽。
<template>
<div>
<slot></slot> <!-- 默认插槽 -->
<slot name="footer"></slot> <!-- 具名插槽 -->
</div>
</template>
6.计算属性(Computed Properties)
计算属性是基于响应式数据的派生状态,可以在模板中直接使用。它们会根据依赖的数据变化自动更新。
const reversedTitle = ref('');
watch(title, (newValue) => {
reversedTitle.value = newValue.split('').reverse().join('');
});
7.观察者(Watchers)
观察者用于观察数据的变化并执行相应的逻辑。可以用于异步操作或复杂逻辑。
watch(title, (newValue, oldValue) => {
console.log(`Title changed from ${oldValue} to ${newValue}`);
});
8.生命周期钩子(Lifecycle Hooks)
生命周期钩子是 Vue 组件在不同阶段(如创建、挂载、更新、销毁)调用的函数。常用的生命周期钩子包括`onMounted`和`onUnmounted`。
onMounted(() => {
console.log('Component mounted');
});
onUnmounted(() => {
console.log('Component unmounted');
});
9.事件处理(Event Handling)
可以在模板中使用`@`符号来监听事件,并在脚本中定义相应的处理方法。
<template>
<button @click="handleClick">Click Me</button>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
export default defineComponent({
setup() {
function handleClick() {
console.log('Button clicked!');
}
return {
handleClick,
};
},
});
</script>
示例:完整的 Vue 3 组件
以下是一个包含上述所有部分的典型 Vue 3 组件示例:
<template>
<div class="my-component">
<h1>{ { title }}</h1>
<p>Reversed Title: { { reversedTitle }}</p>
<button @click="handleClick">Click Me</button>
<slot></slot>
<slot name="footer"></slot>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, watch, onMounted, onUnmounted } from 'vue';
export default defineComponent({
name: 'MyComponent',
props: {
message: {
type: String,
required: true,
},
},
setup(props) {
// 响应式数据
const title = ref('Hello, Vue!');
// 计算属性
const reversedTitle = ref('');
watch(title, (newValue) => {
reversedTitle.value = newValue.split('').reverse().join('');
});
// 方法
function handleClick() {
alert('Button clicked!');
}
// 生命周期钩子
onMounted(() => {
console.log('Component mounted');
});
onUnmounted(() => {
console.log('Component unmounted');
});
// 返回响应式数据和方法
return {
title,
reversedTitle,
handleClick,
};
},
});
</script>
<style scoped>
.my-component {
color: blue;
}
</style>
总结
一个典型的 Vue 3 组件通常包含模板、脚本、样式、属性、插槽、计算属性、观察者、生命周期钩子和事件处理等部分。通过合理使用这些部分,你可以构建出高效、可复用且易于维护的 Vue 3 组件。Vue 3 的 Composition API 提供了更灵活的组件定义方式,使得组件的逻辑更加清晰和易于管理。