Vue组件封装知识总结

news2024/11/15 22:40:59

一、为什么要封装组件

首先,一个好问题,面试要考的!为什么要封装组件呢?

  1. 提高代码的复用性:通过封装,可以将一段代码或一部分功能抽象为一个独立的组件,并在不同的项目或场景中重复使用。这样可以减少代码的重复编写,提高开发效率。

  2. 提供逻辑的封装和隐藏:封装组件可以将复杂的逻辑封装在一个组件内部,对外部提供简单的接口。这样可以隐藏内部实现细节,简化对组件的使用和理解。

  3. 维护和更新的便利性:当系统需要修改或更新某个功能时,只需要修改组件内部的实现逻辑,而不需要修改调用该组件的其他部分。这样可以提高系统的可维护性,降低修改代码的风险。

  4. 提高团队的协作效率:组件的封装可以让开发团队在开发过程中更好地分工合作。团队成员可以根据各自的专长负责开发不同的组件,然后通过接口协议进行集成和测试。

  5. 提高用户体验:通过封装可重用的UI组件,可以确保在不同的页面和应用中保持一致的用户界面和交互,提供更好的用户体验和用户界面的一致性。

二、组件封装需要注意的问题/技巧

封装一个小小的组件也需要注意很多问题,稍不注意将会踩坑,且随着业务需求的不断扩充和项目规模日益壮大,有些小问题会慢慢变成灾难性的大问题。

主要有以下几大注意事项:

1.数据的传递问题

  • 单向数据流(只能是父组件传给子组件中的props,反过来不行)
  • 组件之间如何传值
  • 组件之间的方法如何调用

2.组件的功能和接口设计要合理,要满足用户需求,并且易于使用和理解。

3.组件的封装要考虑可重用性和可扩展性,尽量设计出通用的组件,能够在不同的场景下复用,并且能够方便地进行功能扩展和定制。

4.组件的封装要考虑文档和测试,要提供清晰的文档说明组件的功能和使用方法,并且进行充分的测试,确保组件的质量和稳定性。

三、单向数据流

Vue的官方文档如是说:

        所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。 额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

下面贴上一个小例子:

子组件:

父组件:

summary:

1.子组件和父组件之间要解耦,出现问题时才能更好地去判断位置,同时,在业务需求不断变更的情况下,能够减少修改维护工作。

2.既不能在子组件中更改自己的props值,也不能去通过子组件控制父组件的值的变化,要保证数据的单向传递。

3.子组件自己的方法用自己的状态去控制,父组件同理,所以有需要的时候,可通过增加一个initXXX来作为初始的赋值操作。

四、组件通信

1、组件传值

父子组件之间传值

父传子:通过props,或者this.$children,或者ref;

通过props将数据从父组件传递给子组件,在子组件中通过props来接收和使用这些数据。

子传父:通过this.$emit,或者this.$parent

子组件可以通过$emit方法触发自定义事件,并将数据传递给父组件进行处理,在父组件中通过v-on来监听和响应这些自定义事件。

隔代传值/爷孙组件传值

爷传孙:通过this.$attrs,或者provide;孙传爷:通过this.$listeners,或者inject

爷孙组件之间的通信可以通过provide和inject来实现。provide和inject允许祖先组件(爷组件)向后代组件(孙组件)传递数据或者方法

通过Provide/Inject:通过在父组件中使用provide提供数据,然后在子组件中使用inject来注入并使用这些数据。这样可以实现跨多层级组件的通信。

兄弟组件传值

  1. 通过共同的父组件来传递数据:如果两个组件拥有一个共同的父组件,那么可以在父组件中定义一个数据,并使用props将数据传递给这两个子组件。当一个组件更新数据时,会将数据传递给父组件,再由父组件将数据传递给另一个组件,从而实现兄弟组件之间的通信。

  2. Vuex(状态管理):vuex是Vue的状态管理库,用于管理应用程序的所有状态并将它们集中存储在一个单一的地方。将兄弟组件需要共享的数据存储在vuex中,通过dispatch一个action来改变这个状态的值,并通过getter获取这个状态的值,从而实现兄弟组件之间的通信。

  3. 使用事件总线:事件总线是一个空的Vue实例,可以被用来实现Vue实例之间的通信。在事件总线中定义一个事件,当兄弟组件需要通信时,一个组件可以通过事件总线发送一个事件,而另一个组件可以通过事件总线监听这个事件并做出响应。

  4. 自定义事件:每个Vue实例都维护着一个事件监听器,可以使用on监听事件,使用emit触发事件。一个兄弟组件可以监听一个自定义事件,而另一个组件则可以通过触发该事件并传递需要通信的数据来实现通信。

最后,通过在Vuex中定义的状态和操作,可以让任意组件进行通信。 

2、组件方法调用

父子组件之间方法调用

①Props: 父组件可以通过props将方法传递给子组件,在子组件中可以直接调用这些方法。这种方式适合父组件和子组件之间的单向通信。没错,就是将方法也定义为props。就像这样:

②子组件可以通过$emit方法触发一个自定义事件,并将数据作为参数传递给父组件。在父组件中,可以使用v-on指令监听这个自定义事件,并调用相应的方法。一定要记得@绑定事件啊!!!我本人时常会忘记这个重要的事情。

隔代传值/爷孙组件方法调用

爷组件中使用provide来提供需要共享的数据或方法,然后在孙组件中使用inject来接收这些数据或方法。这样,孙组件就可以调用爷组件提供的方法了。

需要注意的是,使用provide和inject需要谨慎使用,因为它们会破坏了组件之间的封装性,使得组件之间的耦合性增强。因此,建议只在确实需要在爷孙组件之间共享方法时使用。 

兄弟组件方法调用

兄弟组件之间的通信可以通过一个共同的父组件或者全局事件总线(Event Bus)来实现方法的调用。

①通过共同的父组件来实现兄弟组件之间的方法调用:

  • 如果两个组件是兄弟关系,它们的共同父组件可以扮演中介的角色,将需要共享的方法定义在共同父组件上,然后通过props将方法传递给兄弟组件。
  • 兄弟组件可以通过触发事件来通知父组件,父组件再调用相应的方法,从而实现兄弟组件之间的方法调用。

②通过全局事件总线(Event Bus)来实现兄弟组件之间的方法调用:

  • 可以在Vue实例上注册一个事件总线,兄弟组件通过该事件总线来进行通信。
  • 一个典型的做法是在Vue实例上注册一个事件总线,然后在其中定义需要共享的方法,兄弟组件可以通过该事件总线来调用方法。

 需要注意的是,使用全局事件总线需要谨慎使用,因为它可能导致组件之间的通信关系不明显,增加了代码的复杂性。建议在确实需要在兄弟组件之间共享方法时使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1312547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

simulinkveristand联合仿真——模型导入部署简单人机界面

目录 软件版本 simulink模型编译 veristand导入模型 veristand模型参数设置 veristand配置人机交互界面 veristand模型部署运行 软件版本 matlab2020a,veristand2020 R4 环境搭建及软件获取可看simulink&veristand&labview联合仿真环境搭建-CSDN博客…

记录 | docker报错could not select device driver ““ with capabilities: [[gpu]].

ubuntu18.04 上启动 docker start 报错: could not select device driver “” with capabilities: [[gpu]]. docker: Error response from daemon: could not select device driver “” with capabilities: [[gpu]]. ERRO[0005] error waiting for container: con…

如何做到人均告警减少 90%?B 站新一代告警平台的设计与实践

一分钟精华速览 B 站的业务规模和用户群体不断扩大,对于服务的稳定性和可用性的要求也日益增高。这就需要 B 站的监控告警系统能够及时、准确地发现和定位问题,以便尽快解决,维护好用户的使用体验。 本文是对 B 站在告警监控系统上的一次重…

MySQL如何进行Sql优化

(1)客户端发送一条查询语句到服务器; (2)服务器先查询缓存,如果命中缓存,则立即返回存储在缓存中的数据; (3)未命中缓存后,MySQL通过关键字将SQ…

网络层--TCP/UDP协议

目录 一、TCP/UDP协议介绍 1、UDP(User Datagram Protocol)--用户数据报协议 1.1 UDP报文格式 1.2 UDP协议的特性 2、TCP(Transmission Control Protocol )--传输控制协议 2.1 TCP报文格式 2.2 TCP协议的特性 2.3 TCP三次握手 2.4 四次挥手 三、TCP和UDP的区别 四、t…

关于“Python”的核心知识点整理大全21

9.3.2 Python 2.7 中的继承 在Python 2.7中,继承语法稍有不同,ElectricCar类的定义类似于下面这样: class Car(object):def __init__(self, make, model, year):--snip-- class ElectricCar(Car):def __init__(self, make, model, year):supe…

xcode 修改 target 中设备朝向崩溃

修改xcode的target中的设备朝向导致崩溃。 从日志上看好像没有什么特别的信息。 之后想了想,感觉这个应该还是跟xcode的配置有关系,不过改动的地方好像也只有plist。 就又翻腾了半天plist中的各种配置项,再把所有的用户权限提示相关的东西之…

运筹学经典问题(三):最大流问题

问题描述 给定一个图网络 G ( V , E ) G(V, E) G(V,E),网络中连边的权重代表最大容量,在这个图中找出从起点到终点流量最大的路径。 数学建模 集合: I I I:点的集合; E E E:边的集合。 常量&#x…

全光谱的灯对人体有什么伤害?考公护眼台灯推荐

什么是全光谱?全光谱是是一种能够模拟自然光谱的照明设备,通过发出包含所有可见光波长的光线,使人们感受到与自然光类似的照明效果。不同于传统的白炽灯或荧光灯,全光谱灯被认为能够提供更好的视觉质量和更健康的光学经验。现在市…

泊松分布、泊松定理

泊松分布 假设随机变量所有可能的取值为,并且取各个值的概率为: , 其中是常数 那么就称服从参数为的泊松分布,记为。 泊松定理 设是常数,是任意正整数,并且,那么对任意一个非负整数&am…

新一代“垫图”神器,IP-Adapter的完整应用解读

导读 不用训练lora,一张图就能实现风格迁移,还支持多图多特征提取,同时强大的拓展能力还可接入动态prompt矩阵、controlnet等等,这就是IP-Adapter,一种全新的“垫图”方式,让你的AIGC之旅更加高效轻松。 …

14个最经典的git命令,你知道吗?

1 学习14个Git命令,因为你将会在99%的时间里使用它们 必须了解的命令整理 1,git init 初始化一个新的Git仓库。 这将在当前目录中创建一个名为".git"的子目录,Git会将所有仓库的元数据存储在其中。 2,git clone 克…

使用Python绘制二元函数图像详解

概要 在数据科学、数学建模和机器学习中,经常需要可视化二元函数的图像以更好地理解函数的行为。Python提供了丰富的绘图库,如Matplotlib和NumPy,使得绘制二元函数图像变得简便而灵活。本文将介绍如何使用Python创建并美化二元函数图像&…

pandas读取Excel表指定数值 计算总和

题目要求:在一个文件夹里面有424个Excel表格,每个表格中都是统一的,如下图。要求计算所有表格中金额的总和。 上代码: import os import glob import pandas as pd# 指定文件夹路径 folder_path C:\\Users\\Administrator\\Desk…

Salesforce“卷土重来”:对中国CRM市场影响在哪?

于本土CRM而言,Salesforce是一面镜子,也更是催化剂。 长期来看,Salesforce的加入,从某种程度上将会加速中国CRM赛道的合理价值曲线的走向,通过带动外界对于CRM整个赛道的关注和热度,进而加速本土CRM的成长…

Java学习-连接Mysql数据库

1.先在Mysql里面构建一个表格 例子:名字为user1,两列分别为name、score 2.正确导入了MySQL的JDBC驱动程序 2.1 下载驱动包(与自己的服务器版本匹配) 官网地址:Maven Repository: mysql mysql-connector-java 8.0.29 …

JVM调优:参数(学习笔记)

一、jvm的运行参数 标准参数 -help、-version、-D参数 jvm的标准参数,一般都是很稳定的,在未来的JVM版本中不会改变,可以使用java -help 检索出所有的标准参数。 通过以下命令查看: 命令:java -help 可以看到我们经常…

C与C++编程语言的区别和联系

一、引言 C和C是两种广泛使用的编程语言,它们都在软件开发领域有着广泛的应用。虽然C是从C语言演化而来的,但两者之间存在一些重要的区别和联系。本文将详细介绍这两种编程语言的相同点和不同点,并通过实际例子进行说明。 二、C与C的相同点 …

如何查看Linux中glibc的Version

用ldd --version ldd --version 运行libc.so 你没有看错,libc.so是一个可执行程序。 但前提是你要找到它。因为它并不在PATH所包含的目录下。 ppdell:~$ ldd which cat | grep libclibc.so.6 > /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0e6fb34000)ppdell:~…

GPT-4.5 要来了!谷歌大模型 Gemini 确实给够压力

GPT-4 还没用明白,GPT-4.5 就要发布了。 最近,OpenAI 泄露了 GPT-4.5 的发布页面,除了进一步增强复杂推理和跨模态理解,GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持,也就意味着多模态最后一块版图…