文章目录
.vue
文件是Vue.js框架中单文件组件(SFC)的核心载体,通过<template>
、<script>
、<style>
三大块,将HTML模板、JavaScript逻辑、CSS样式封装在一个文件中,实现组件化开发。它的核心优势是高内聚、低耦合、易维护。以下是详细解析:
一、.vue文件基础结构
一个典型的.vue
文件由三部分组成,按功能明确划分:
<!-- 1. 模板:定义组件的HTML结构 -->
<template>
<div class="demo">
<h1>{{ title }}</h1>
<button @click="handleClick">点击</button>
</div>
</template>
<!-- 2. 脚本:定义组件的逻辑(数据、方法等) -->
<script>
export default {
data() {
return { title: 'Hello Vue!' };
},
methods: {
handleClick() { alert('Clicked!'); }
}
}
</script>
<!-- 3. 样式:定义组件的CSS样式 -->
<style scoped>
.demo { color: red; }
</style>
二、各部分详解与最佳实践
1. <template>
:模板层
- 作用:编写组件的HTML结构,支持Vue指令(如
v-if
、v-for
)。 - 规则:
- 必须包含一个根元素(如
<div>
包裹所有内容)。 - 使用双大括号
{{ }}
插值表达式绑定数据。
- 必须包含一个根元素(如
- 示例:
<template> <!-- 根元素 --> <div> <p v-if="showText">{{ message }}</p> <ul> <li v-for="item in list" :key="item.id">{{ item.name }}</li> </ul> </div> </template>
2. <script>
:逻辑层
- 作用:定义组件的数据、方法、生命周期钩子等。
- 两种写法:
- 选项式API(Options API):适合新手,逻辑分散但直观。
<script> export default { data() { return { count: 0 }; }, methods: { increment() { this.count++; } } } </script>
- 组合式API(Composition API):推荐复杂项目,逻辑聚合。
<script setup> import { ref } from 'vue'; const count = ref(0); const increment = () => { count.value++; }; </script>
- 选项式API(Options API):适合新手,逻辑分散但直观。
3. <style>
:样式层
- 作用:编写组件的CSS样式,支持
scoped
作用域隔离。 - 关键特性:
scoped
属性:样式仅作用于当前组件,避免全局污染。- 支持预处理器:如
<style lang="scss">
使用Sass语法。
- 示例:
<style scoped> .container { padding: 20px; } button:hover { background: #eee; } </style>
三、进阶用法与配置
1. 使用<script setup>
语法糖
- 作用:简化组合式API代码,无需显式
setup()
函数。 - 对比传统写法:
<!-- 传统组合式API --> <script> import { ref } from 'vue'; export default { setup() { const count = ref(0); return { count }; } } </script> <!-- 使用setup语法糖 --> <script setup> import { ref } from 'vue'; const count = ref(0); </script>
2. 模块化引入与组件注册
- 引入子组件:直接在
<script>
中导入并注册。<script setup> import ChildComponent from './ChildComponent.vue'; </script> <template> <ChildComponent /> </template>
3. 自定义块与工具集成
- 自定义块:如
<docs>
用于编写组件文档(需配合工具解析)。<docs> ## 示例组件 这是一个展示用组件,点击按钮触发事件。 </docs>
四、常见问题与避坑指南
1. 为什么必须用根元素包裹模板?
- 原因:Vue的虚拟DOM需要单一根节点来生成渲染树。
- 解决方案:用
<div>
或Vue 3的<Fragment>
(隐式支持多根节点)。
2. scoped
样式原理是什么?
- 实现方式:通过添加唯一属性选择器(如
data-v-123
)隔离样式。<!-- 编译前 --> <style scoped> .demo { color: red; } </style> <!-- 编译后 --> <style> .demo[data-v-123] { color: red; } </style>
3. 如何全局覆盖scoped
样式?
- 穿透选择器:使用
::v-deep
或>>>
(Sass中需用::v-global
)。<style scoped> ::v-deep .ant-btn { color: blue; } </style>
五、总结:记忆口诀与模板示例
记忆口诀:
- 模板脚本样式块,单文件里全封装;
- 根元素、作用域,组合选项按需选;
- 数据绑定双括号,方法事件@来管。
完整模板示例:
<template>
<div class="container">
<h1>{{ title }}</h1>
<button @click="handleClick">点击次数:{{ count }}</button>
</div>
</template>
<script setup>
import { ref } from 'vue';
const count = ref(0);
const title = 'Vue3组件示例';
const handleClick = () => { count.value++; };
</script>
<style scoped>
.container { padding: 20px; }
button { background: #4CAF50; color: white; }
</style>
下篇 请见 👉 论.vue文件的代码模板2.0