当前位置: 首页 > news >正文

Vue: 组件基础

1. 组件概念与优势

1.1 什么是组件?

        组件是Vue的核心特性之一,允许我们将UI划分为独立的、可重用的部分,每个部分可以单独思考和开发。

1.2 组件树结构

应用根组件
├── 头部组件
├── 导航组件
└── 内容区域组件├── 文章组件├── 侧边栏组件└── 评论组件

1.3 组件优势

  • 可复用性:一次编写,多处使用

  • 可维护性:每个组件功能独立,易于维护

  • 协作开发:不同开发者可同时开发不同组件

2. 定义组件

2.1 单文件组件(SFC)

使用.vue文件定义组件,包含三个部分:

<template><!-- HTML模板 --><button @click="count++">You clicked me {{ count }} times.</button>
</template><script setup>
import { ref } from 'vue'
// JavaScript逻辑
const count = ref(0)
</script><style>
/* CSS样式 */
</style>

2.2 非构建环境组件

使用JavaScript对象定义:

import { ref } from 'vue'export default {setup() {const count = ref(0)return { count }},template: `<button @click="count++">You clicked me {{ count }} times.</button>`
}

3. 使用组件

3.1 组件注册与使用

<script setup>
// 1. 导入组件
import ButtonCounter from './ButtonCounter.vue'
</script><template><!-- 2. 使用组件 --><h1>Here is a child component!</h1><ButtonCounter /><ButtonCounter /><ButtonCounter />
</template>

3.2 组件命名规范

环境命名方式示例
单文件组件PascalCase<ButtonCounter>
DOM内模板kebab-case<button-counter>

4. 组件通信

4.1 Props(父→子通信)

父组件传递数据

<BlogPost title="My journey with Vue" />
<BlogPost :title="post.title" /> <!-- 动态prop -->

子组件接收数据

<script setup>
// 方式1: 使用defineProps
const props = defineProps(['title'])
console.log(props.title)// 方式2: 选项式API
export default {props: ['title'],setup(props) {console.log(props.title)}
}
</script><template><h4>{{ title }}</h4>
</template>

4.2 自定义事件(子→父通信)

子组件触发事件

<script setup>
const emit = defineEmits(['enlarge-text'])// 触发事件
function enlargeText() {emit('enlarge-text')
}
</script><template><button @click="$emit('enlarge-text')">Enlarge text</button>
</template>

父组件监听事件

<BlogPost @enlarge-text="postFontSize += 0.1" />

4.3 组件通信流程图

父组件│├── 通过Props传递数据 → 子组件│└── 通过v-on监听事件 ← 子组件通过$emit发送事件

5. 插槽(Slot)

5.1 基本插槽使用

定义带插槽的组件

<template><div class="alert-box"><strong>This is an Error for Demo Purposes</strong><slot /> <!-- 插槽位置 --></div>
</template>

使用插槽

<AlertBox>Something bad happened. <!-- 插入的内容 -->
</AlertBox>

6. 动态组件

6.1 动态切换组件

<script setup>
import Home from './Home.vue'
import Posts from './Posts.vue'
import Archive from './Archive.vue'
import { ref } from 'vue'const currentTab = ref('Home')
const tabs = {Home,Posts,Archive
}
</script><template><buttonv-for="(_, tab) in tabs":key="tab"@click="currentTab = tab">{{ tab }}</button><component :is="tabs[currentTab]" class="tab"></component>
</template>

6.2 保持组件状态

使用<KeepAlive>保持动态组件状态:

<KeepAlive><component :is="activeComponent" />
</KeepAlive>

7. DOM内模板解析注意事项

7.1 大小写转换

JavaScript中DOM模板中
PascalCasekebab-case
camelCasekebab-case

7.2 闭合标签要求

<!-- 正确 -->
<my-component></my-component><!-- 在DOM模板中错误 -->
<my-component />

7.3 元素位置限制解决方案

<table><!-- 使用is属性解决元素限制 --><tr is="vue:blog-post-row"></tr>
</table>

8. 总结与核心概念

8.1 组件核心概念图

组件系统
├── 组件定义
│   ├── 单文件组件(.vue)
│   └── JavaScript对象
├── 组件使用
│   ├── 局部注册
│   └── 全局注册
├── 组件通信
│   ├── Props(向下传递)
│   ├── 事件(向上传递)
│   └── 插槽(内容分发)
└── 高级特性├── 动态组件└── 保持状态(KeepAlive)

8.2 关键点总结

  1. 组件是Vue应用的构建块,提供封装和复用能力

  2. 单文件组件是推荐的使用方式,结合了模板、脚本和样式

  3. Props向下传递数据,事件向上传递消息

  4. 插槽允许父组件向子组件注入内容

  5. 动态组件使用:is属性实现组件切换

  6. DOM内模板有特殊解析规则,需要注意大小写和标签闭合

通过组件化开发,可以构建出结构清晰、维护性高的大型Vue应用程序。


文章转载自:

http://iXlcMrU4.ntgrn.cn
http://5VsW1fMK.ntgrn.cn
http://zO1uyPHO.ntgrn.cn
http://ygpYVJ7D.ntgrn.cn
http://h6SZGTLq.ntgrn.cn
http://bqHQo9Wp.ntgrn.cn
http://CT6E9bQf.ntgrn.cn
http://Rrb7Q2ai.ntgrn.cn
http://2VoxwEO9.ntgrn.cn
http://2IHlxmDK.ntgrn.cn
http://lL9JlJpM.ntgrn.cn
http://bJZkqvLQ.ntgrn.cn
http://zZDmeBYt.ntgrn.cn
http://oY5JiL00.ntgrn.cn
http://uGyhrHla.ntgrn.cn
http://RvtM6h3o.ntgrn.cn
http://Sik8lqbg.ntgrn.cn
http://hA0diZoN.ntgrn.cn
http://M6dEQNRk.ntgrn.cn
http://9cNJa9m3.ntgrn.cn
http://M5oGlI3T.ntgrn.cn
http://jeeDnIDN.ntgrn.cn
http://LePMWd21.ntgrn.cn
http://Qi1Nd7SE.ntgrn.cn
http://WxKf62zF.ntgrn.cn
http://qcn48p3N.ntgrn.cn
http://DhzCFXvX.ntgrn.cn
http://EtUfW54q.ntgrn.cn
http://u3qLCU7T.ntgrn.cn
http://zU07gXOH.ntgrn.cn
http://www.dtcms.com/a/386010.html

相关文章:

  • 亚马逊云科技 EC2 服务终端节点:安全高效访问云服务的利器
  • 2026届计算机毕业设计选题 大数据毕业设计选题推荐 题目新颖 数据分析 可视化大屏 通过率高
  • html实现文字横向对齐以及margin的解释
  • 如何轻松找到并畅玩Edge浏览器隐藏的冲浪小游戏
  • K8S中的神秘任务Job与CronJob
  • go grpc开发使用
  • [论文阅读] 人工智能 + 软件工程 | 告别冗余HTML与高算力消耗:EfficientUICoder如何破解UI2Code的token难题
  • Golang语言入门篇004_Go命令详解
  • K8S的Pod状态处理指南
  • Gin框架:构建高性能Go Web应用
  • Golang中的NaN(Not a Number)
  • golang 做webrtc开发核心
  • Go语言中 error 接口与自定义错误类型的深入解析
  • D008 vue+django+neo4j基于知识图谱的政务服务搜索推荐系统
  • 一个高精度通用模板
  • Flink 1.17.2 集群安装部署
  • Git 本地分支推送多个远程分支
  • JVM性能监控与调优(一):命令行工具
  • 协方差——————
  • Node.js 框架 Express 介绍
  • Node.js 文件上传中文文件名乱码问题,为什么只有Node会有乱码问题,其他后端框架少见?
  • Redis 线上遍历 Key 的正确姿势:SCAN 命令详解
  • 【软考】笔记总结二
  • gemini cli 一个可以参考的prompt
  • 第9章 Prompt提示词设计
  • 嘉银科技基于阿里云 Kafka Serverless 提升业务弹性能力,节省成本超过 20%
  • 信任链验证流程
  • 从技术视角解析加密货币/虚拟货币/稳定币的设计与演进
  • Redis(高性能数据处理、NOSQL、分库分表)
  • CI/CD开发工作流实践技术日志