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

Vue3从零开始——带你轻松掌握组件的基本操作

文章目录

  • 1. Vue 组件的基础概念
    • 1.1 什么是组件?
    • 1.2 组件的作用
    • 1.3 组件的分类(全局组件 vs 局部组件)
  • 2. 创建和注册组件
    • 2.1 单文件组件(SFC)
    • 2.2 全局组件注册
    • 2.3 局部组件注册
  • 3. 组件命名格式
  • 4. ref获取DOM元素
    • 4.1 基本流程
    • 4.2 获取组件引用
  • 5. `ref`​ 操作组件 - `defineExpose`​
    • 5.1 `defineExpose`​ 的作用
    • 5.2 使用 `defineExpose`​ 暴露组件内部属性和方法
  • 5. 总结

在这里插入图片描述

1. Vue 组件的基础概念

下载 (14)

1.1 什么是组件?

组件是 Vue.js 中用于构建用户界面的独立、可复用的模块。组件允许开发者将应用程序的界面划分为多个独立的部分,每个部分对应一个功能或视图。这些部分可以独立开发、测试和维护,然后通过组合的方式构建复杂的界面。

组件的本质是一个带有 template​、script​ 和 style​ 的自包含模块:

  • template​:定义了组件的结构和内容。
  • script​:包含组件的逻辑,如数据、方法和生命周期钩子。
  • style​:定义了组件的样式,可以使用 Scoped CSS 来确保样式仅作用于当前组件。

1.2 组件的作用

  • 模块化:组件将大规模的应用程序分解为小型、独立、可复用的模块,便于管理和维护。
  • 复用性:组件可以在不同的地方重复使用,避免代码冗余,提高开发效率。
  • 可维护性:组件的独立性使得它们更容易调试和更新,而不必担心影响到其他部分。

1.3 组件的分类(全局组件 vs 局部组件)

根据组件的注册方式,Vue 组件可以分为全局组件和局部组件。

全局组件:一旦注册为全局组件,可以在任何地方使用,而无需再次引入和注册。

示例:

import MyComponent from './MyComponent.vue';
app.component('MyComponent', MyComponent);

局部组件:仅在注册了该组件的父组件或页面中可用,通常用于更加局部化的功能需求。

示例:

<script setup>
import MyComponent from './MyComponent.vue';
</script><template><MyComponent />
</template>

2. 创建和注册组件

2.1 单文件组件(SFC)

Vue 的单文件组件(SFC, Single File Component)是最常见的组件格式,将组件的模板、逻辑和样式整合在一个 .vue​ 文件中。SFC 提供了清晰的结构和高效的开发体验。

SFC 的基本结构:

<template><div><p>{{ message }}</p></div>
</template><script setup>
import { ref } from 'vue';const message = ref('Hello, Vue!');
</script><style scoped>
p {color: blue;
}
</style>
  • <template> ​:定义组件的模板部分,描述了组件的结构和布局。
  • <script setup> ​:包含组件的逻辑部分,使用 Vue 的组合式 API 进行数据和方法的管理。
  • <style> ​:定义组件的样式,使用 scoped​ 属性确保样式仅作用于当前组件。

2.2 全局组件注册

全局组件可以在 Vue 应用中的任何地方使用。通常在应用的入口文件(如 main.js​ 或 main.ts​)中注册。

步骤

  1. 创建一个全局组件:
<!-- GlobalComponent.vue -->
<template><div><h3>这是一个全局组件</h3></div>
</template><script setup>
</script><style scoped>
h3 {color: red;
}
</style>
  1. 在应用入口文件中注册全局组件:
import { createApp } from 'vue';
import App from './App.vue';
import GlobalComponent from './components/GlobalComponent.vue';const app = createApp(App);// 注册全局组件
app.component('GlobalComponent', GlobalComponent);app.mount('#app');
  1. 在任何地方使用全局组件:
<!-- APP.vue -->
<template><div><h1>这是父组件</h1><GlobalComponent></GlobalComponent></div>
</template><script setup>
</script><style scoped></style>

效果:

image

2.3 局部组件注册

局部组件注册意味着组件只能在注册它的父组件或页面中使用。局部组件注册通常在使用组合式 API 时通过 <script setup>​ 标签完成。

示例:

  1. 创建一个局部组件:
<!-- LocalComponent.vue -->
<template><div><h3>这是一个局部组件</h3></div>
</template><script setup>
</script><style scoped>
h3 {color: green;
}
</style>
  1. 在父组件中注册和使用局部组件:
<!-- APP.vue -->
<template><div><h1>这是父组件</h1><LocalComponent></LocalComponent></div>
</template><script setup>
// 注册局部组件
import LocalComponent from './components/LocalComponent.vue';
</script>

效果:

image

3. 组件命名格式

引用来源: Vue3——组件名格式

在整个指引中,我们都使用 PascalCase 作为组件名的注册格式,这是因为:

  1. PascalCase 是合法的 JavaScript 标识符。这使得在 JavaScript 中导入和注册组件都很容易,同时 IDE 也能提供较好的自动补全。
  2. <PascalCase />​ 在模板中更明显地表明了这是一个 Vue 组件,而不是原生 HTML 元素。同时也能够将 Vue 组件和自定义元素 (web components) 区分开来。

为了方便,Vue 支持将模板中使用 kebab-case 的标签解析为使用 PascalCase 注册的组件。这意味着一个以 MyComponent​ 为名注册的组件,在模板中可以通过 <MyComponent>​ 或 <my-component>​ 引用。这让我们能够使用同样的 JavaScript 组件注册代码来配合不同来源的模板。

比如之前的全局组件的使用就可以这样写:

<!-- APP.vue -->
<template><div><h1>这是父组件</h1><!-- <GlobalComponent></GlobalComponent> --><global-component></global-component></div>
</template><script setup>
</script><style scoped></style>

4. ref获取DOM元素

在 Vue 3 中,使用 ref​ 可以将 DOM 元素引用存储到一个响应式变量中。与响应式数据不同,ref​ 在这里并不创建响应式数据,而是获取元素的引用,方便后续在逻辑中直接访问该元素。

4.1 基本流程

  1. 创建 ​一个 ref​变量 来存放该元素的引用。
  2. 在模板中声明 ref​ 属性。
  3. 操作 DOM 元素。
<template><!-- 2. 在模板中声明刚才 ref 属性,注意要与刚才定义的 ref 变量名称相同 --><div ref="myDiv">这是一个需要获取的 div 元素</div><button @click="change">改变样式</button>
</template><script setup>
import { ref, onMounted } from 'vue';
// 1. 创建一个 ref 变量来存储 div 元素引用
const myDiv = ref(null);function change() {// 3. 使用 ref 变量来获取 div 元素,操作 DOM// 设置背景色myDiv.value.style.backgroundColor = 'lightblue';// 设置文本myDiv.value.innerHTML = 'Hello, Vue 3!';}
</script>

效果:

recording

4.2 获取组件引用

同样的,组件也可以通过这种方式获取引用:

<script setup>
import { ref, onMounted } from 'vue'
import Child from './Child.vue'const child = ref(null)onMounted(() => {// child.value 是 <Child /> 组件的实例
})
</script><template><Child ref="child" />
</template>

5. ref​ 操作组件 - defineExpose

如果想要在父组件中访问子组件的某些特定属性或方法,单靠 ref​ 是不够的。这时候,我们需要使用 defineExpose​ 来显式暴露子组件的属性或方法。

5.1 defineExpose​ 的作用

defineExpose​ 是 Vue 3 提供的一个新的组合式 API 工具,用于显式暴露组件内部的属性或方法。在默认情况下,组合式 API 中的状态或方法不会自动暴露给父组件,而使用 defineExpose​ 可以选择性地暴露这些内部内容,使其可以被父组件访问。

5.2 使用 defineExpose​ 暴露组件内部属性和方法

示例:

<!-- ChildComponent.vue -->
<template><div><p>子组件内容</p></div>
</template><script setup>
import { ref } from 'vue';// 1. 定义内部属性和方法
const internalState = ref('这是子组件的状态');
function internalMethod() {console.log('子组件方法被调用');
}// 2. 使用 defineExpose 暴露属性和方法
defineExpose({internalState,internalMethod,
});
</script>
<!-- ParentComponent.vue -->
<template><div><ChildComponent ref="childRef" /><button @click="useChildMethod">调用子组件方法</button><p>子组件状态: {{ childState }}</p></div>
</template><script setup>
import { ref, watch } from 'vue';
import ChildComponent from './ChildComponent.vue';const childRef = ref(null);
const childState = ref(null);
// 3. 调用子组件方法
function useChildMethod() {if (childRef.value) {childRef.value.internalMethod();}
}
// 监听子组件状态的变化
watch(childRef, (newVal) => {if (newVal) {childState.value = newVal.internalState;}
});
</script>

代码解释:

  • 在子组件中

    • internalState​ 是子组件的内部状态,internalMethod​ 是子组件的方法。
    • 使用 defineExpose​ 将 internalState​ 和 internalMethod​ 显式暴露给父组件。
  • 在父组件中

    • 通过 ref​ 获取子组件实例 childRef​,然后通过 childRef.value.internalMethod()​ 调用子组件的方法。
    • 使用 watch​ 监听 childRef​ 的变化,并通过 newVal.internalState​ 访问子组件的暴露状态。

image-20240815200313687

5. 总结

通过本文,我们简单讲解了Vue中组件的基本概念、作用以及最基本的使用,除此之外还讲解了如何获取DOM元素的引用和暴露子组件数据和方法,然而组件还有更多进阶知识,比如如何绑定子组件监听事件、组件通信等等知识,后面的知识我们在之后的博客进行讲解,希望对大家有所帮助☺️。


参考文章:

Vue3文档

在这里插入图片描述

相关文章:

Vue3从零开始——带你轻松掌握组件的基本操作

文章目录 1. Vue 组件的基础概念1.1 什么是组件&#xff1f;1.2 组件的作用1.3 组件的分类&#xff08;全局组件 vs 局部组件&#xff09; 2. 创建和注册组件2.1 单文件组件&#xff08;SFC&#xff09;2.2 全局组件注册2.3 局部组件注册 3. 组件命名格式4. ref获取DOM元素4.1 …...

【MySQL 03】库的操作 (带思维导图)

文章目录 &#x1f308; 一、创建数据库&#x1f308; 二、查看数据库&#x1f308; 三、使用数据库&#x1f308; 四、修改数据库&#x1f308; 五、删除数据库&#x1f308; 六、备份数据库&#x1f308; 七、恢复数据库&#x1f308; 八、字符集和校验规则⭐ 1. 查看系统默认…...

SpringBoot-读取配置文件内容

目录 前言 主页&#xff08;端口号默认8080&#xff09; 1 Value 注解 引用变量的使用 2 Environment 对象 3 ConfigurationProperties &#xff08;配置内容和对象&#xff0c;进行相互绑定&#xff09; 前言 读取配置文件有3 种方式 (1) Value注解 (2) Environm…...

springboot整合springmvc

1、创建springboot项目&#xff0c;勾选Spring web 当前springboot选择的是2.6.13版本&#xff0c;jdk1.8尽量选2.几的springboot 2、在pom.xml中导入相应的坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-…...

el-cascader多选的父子关联和父子不关联功能

公用html&#xff1a; <el-cascader v-model"data" :options"optionsData" :props"props" clearable> </el-cascader> 公用js变量&#xff1a; data () {return {// 绑定的数组data: [],// 绑定的选项数据optionsData: []} }, 公…...

#Datawhale AI夏令营第4期#多模态大模型Task2

赛事进阶解读 关于赛事介绍&#xff1a; Better Synth 是一项以数据为中心的挑战赛&#xff0c;考察如何合成与清洗图文数据以在多模态大模型上取得更优的图片理解能力。 本次比赛基于 Mini-Gemini 模型进行训练&#xff0c;只关注于预训练&#xff08;模态间对齐&#xff09…...

LeetCode 热题100-1

两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任…...

表现良好的最长时间段(LeetCode)

题目 给你一份工作时间表 hours&#xff0c;上面记录着某一位员工每天的工作小时数。 我们认为当员工一天中的工作小时数大于 8 小时的时候&#xff0c;那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」&#xff0c;意味在这段时间内&#xff0c;「劳累的天数」是严格…...

【性能优化】DNS解析优化

前言 DNS解析过程消耗时间DNS有本地缓存 比如首次访问某站点&#xff0c;会耗费很多时间进行DNS解析&#xff0c;但解析结束后会将ip地址存入本地设备&#xff0c;后续再访问此域名时就会直接从缓存中取。 首次访问页面时&#xff0c;本页面的DNS解析是无法优化的&#xff0…...

【剑指 offer】合并链表

目 录 描述&#xff1a; 输入两个递增的链表&#xff0c;单个链表的长度为 n&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 思路&#xff1a; 定义一个新链表&#xff0c;先进行我们的原俩链表判断&#xff0c;然后比较俩链表的每个节点大小&#xff0c;然…...

红酒与节日装饰:打造节日氛围的需备品

随着节日的脚步渐渐临近&#xff0c;节日的氛围也愈发浓厚。在这个特殊的时刻&#xff0c;红酒与节日装饰无疑成为了营造节日氛围的需备品。洒派红酒&#xff08;Bold & Generous&#xff09;作为定制红酒的品牌&#xff0c;其不同的韵味与节日装饰的精致整合&#xff0c;共…...

Element Plus的el-carousel走马灯平铺多张图片

效果 <template><div class"system-banner"><el-carousel height"320px" indicator-position"outside" :autoplay"false"><el-carousel-item v-for"(item, index) in govList" :key"index"…...

【promise】Promise的几个关键问题 (三)

Ⅰ-如何改变 promise 的状态? (1) resolve(value): 如果当前是 pending 就会变为 resolved (2) reject(reason): 如果当前是 pending 就会变为 rejected (3) 抛出异常: 如果当前是 pending 就会变为 rejected Ⅱ-一个 promise 指定多个成功/失败回调函数, 都会调用吗? 当 pro…...

利用ZXing.Net Bindings for EmguCV识别条形码及绘制条形码边框17(C#)

上一篇博文&#xff1a;绘制条形码的效果不是很好&#xff1a;利用Emgucv绘制条形码边框16(C#)-CSDN博客 测试环境&#xff1a; win11 64位操作系统 visual studio 2022 ZXing.Net.Bindings.EmguCV 0.16.4 测试步骤如下&#xff1a; 1 新建.net framework 4.8的控制台项目…...

IP代理如何增强网络安全性?

在当今的数字时代&#xff0c;网络安全已成为一个关键问题&#xff0c;而使用 IP 代理可以成为增强网络安全的有效方法。根据请求信息的安全性&#xff0c;IP 代理服务器可分为三类&#xff1a;高级匿名代理、普通匿名代理和透明代理。此外&#xff0c;根据使用的用途&#xff…...

NDP(Neighbor Discovery Protocol)简介

定义 邻居发现协议NDP&#xff08;Neighbor Discovery Protocol&#xff09;是IPv6协议体系中一个重要的基础协议。邻居发现协议替代了IPv4的ARP&#xff08;Address Resolution Protocol&#xff09;和ICMP路由设备发现&#xff08;Router Discovery&#xff09;&#xff0c;…...

为何要隐藏源 IP 地址?

概述 在网络世界中&#xff0c;服务器的安全至关重要。一旦服务器遭受黑客攻击&#xff0c;采取正确的防御措施是防止进一步损害的关键。其中一项重要的策略就是隐藏服务器的真实 IP 地址。本文将探讨隐藏源 IP 地址的重要性&#xff0c;并提供一些实用的方法来实现这一目标。…...

目前最流行的前端构建工具,你知道几个?

现在的市面上有很多不同的前端构建工具&#xff0c;我们很难对它们一一进行关注。在本文中&#xff0c;我们将重点介绍最受欢迎的几种&#xff0c;并探讨开发人员喜欢或不喜欢它们的原因。 Webpack Webpack 是一个模块打包器&#xff0c;主要用于处理 Web 应用程序的资源的优化…...

C++函数模板温习总结

函数模板 // 1、typename 在这里是类型重定义(typedef)&#xff0c;而不是宏替换(#define) //2、模板的非类型参数&#xff0c;属性为const &#xff0c; 不允许修改 //3、函数模板不允许部分特例化&#xff0c;类模板可以 //4、模板函数和非模板函数重载&#xff0c;优先调用…...

【网络】套接字(socket)编程——TCP版

接着上一篇文章&#xff1a;http://t.csdnimg.cn/GZDlI 在上一篇文章中&#xff0c;我们实现的是UDP协议的&#xff0c;今天我们就要来实现一下TCP版本的 接下来接下来实现一批基于 TCP 协议的网络程序&#xff0c;本节只介绍基于IPv4的socket网络编程 基于 TCP 的网络编程开…...

水凝胶生物打印是什么?如何指导Organoids培养?有啥好处?

大家好&#xff0c;我们来了解这篇《Hydrogel-in-hydrogel live bioprinting for guidance and control of organoids and organotypic cultures》发表在《Nature Communications》的一篇文章。三维水凝胶基器官样培养&#xff0c;如类器官和体外器官型培养&#xff0c;能够自我…...

从springBoot框架服务器上下载文件 自定义一个启动器

在springboot框架中下载服务器存储的图片&#xff1a; 1&#xff09;springboot默认访问放行的目录只有static&#xff0c;在static目录下存放图片资源 2&#xff09;编译后的static目录中有一个1.png 2.5)编写控制器&#xff1a; Controller //RequestMapping("/upload&q…...

某通电子文档安全管理系统 CDGAuthoriseTempletService1接口SQL注入漏洞复现 [附POC]

文章目录 某通电子文档安全管理系统 CDGAuthoriseTempletService1接口SQL注入漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现0x06 修复建议某通电子文档安全管理系统 CDGAuthoriseTempletService1接口SQL注入漏…...

pythonselenium自动化测试实战项目(完整、全面)

前言 之前的文章说过&#xff0c; 要写一篇自动化实战的文章&#xff0c; 这段时间比较忙再加回家过11一直没有更新博客&#xff0c;今天整理一下实战项目的代码共大家学习。&#xff08;注:项目是针对我们公司内部系统的测试&#xff0c;只能内部网络访问&#xff0c;外部网络…...

如何选择合适的虚拟机软件?对比Parallels Desktop 和VMware Fusion 使用虚拟机畅玩黑神话悟空

随着技术的发展&#xff0c;虚拟机软件将更加高效地管理和分配系统资源。虚拟机软件扮演着越来越重要的角色。无论是软件开发者需要测试不同操作系统环境下的应用&#xff0c;还是普通用户希望在一台机器上同时运行多个操作系统&#xff0c;虚拟机软件都是不可或缺的工具。那么…...

ESP32FreeRTOS开发笔记:2.定义、多任务与优先级调度

FreeRTOS 是一种实时操作系统(RTOS),专门用于嵌入式系统。它之所以被称为 "FreeRTOS",是因为它是一个免费和开源的 RTOS。下面我们具体讨论一下 FreeRTOS 与 RTOS 的区别,以及 "free" 的含义。 一、什么是 RTOS? RTOS,全称 Real-Time Operating Sy…...

【Python-办公自动化】1秒比较出2张表格之间的不同并标黄加粗

欢迎来到"花花 Show Python"&#xff0c;一名热爱编程和分享知识的技术博主。在这里&#xff0c;我将与您一同探索Python的奥秘&#xff0c;分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者&#xff0c;都能在这里找到有价值的信息和灵感。 自我介…...

Linux下查看各进程的swap

cat /etc/re*se Red Hat Enterprise Linux Server release 6.8 (Santiago) 简单的可以通过top命令查看 top 后 按 f 进入选择列界面 按 p 就会输出swap信息&#xff08;变为P&#xff09; 回车返回看到SWAP信息了 再按 F 再按p 按swap排序 再回车后就是各进程按swap排序…...

最后一个单词的长度 简单字符串问题

给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例 1&#xff1a; 输入&#xff1a;s "Hello World" 输出&#xff1a;5 解…...

Autodesk Mudbox 2024:重塑创意边界的3D数字绘画与雕刻利器

在数字艺术与设计领域&#xff0c;Autodesk Mudbox 2024以其卓越的性能和直观的操作界面&#xff0c;再次刷新了3D数字绘画与雕刻软件的标准。作为Autodesk家族的一员&#xff0c;Mudbox不仅继承了其家族强大的技术基因&#xff0c;更在细节上精雕细琢&#xff0c;为艺术家和设…...