Vue组件封装知识总结

一、为什么要封装组件

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

  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.rhkb.cn/news/219185.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JSON Ajax

1. JSON概念 JSON,全称JavaScript Object Notation,即JavaScript对象表示法,是一种轻量级的数据交换格式。它基于JavaScript的子集,易于人阅读和编写,同时也易于机器解析和生成。 JSON的诞生,是为了解决电…

SE考研真题总结(二)

接上条,今天继续更新~ SE考研真题总结(一)-CSDN博客文章浏览阅读340次,点赞6次,收藏11次。本帖开始分享考研真题中设计【软件工程】的部分,预计会出5期左右,敬请期待~https://blog.csdn.net/js…

Apache SeaTunne简介

Apache SeaTunne简介 文章目录 1.Apache SeaTunne是什么?1.1[官网](https://seatunnel.apache.org/)1.2 项目地址 2.架构3.特性3.1 丰富且可扩展的连接器和插件机制3.2 支持分布式快照算法以确保数据一致性3.3 支持流、批数据处理,支持全量、增量和实时数…

Jmeter接口自动化测试 —— Jmeter变量的使用

​在使用jmeter进行接口测试时,我们难免会遇到需要从上下文中获取测试数据的情况,这个时候就需要引入变量了。 定义变量 添加->配置元件->用户自定义的变量 添加->配置元件->CSV 数据文件设置 变量的调用方式:${变量名} 变量的…

0x31 质数

0x31 质数 定义: 若一个正整数无法被除了1和它自身之外的任何自然数整除,则称该数为质数(或素数),否则则称该正整数为合数。 在整个自然数集合中,质数的数量不多,分布比较稀疏,对…

【教学类-06-19】20231217 (按“列”正序题)X-Y之间“加法题+题”(1页最多0-13。填满115空格)

作品展示:按列排序,从小到大正序(没有大量空格) 1.会有空格做分割线,上面部分是所有的小到大正序加法,下面的部分就是正序题目的不重复随机抽取题目(乱序题) 2、包含分割空格&…

【Java】智慧工地系统:让建筑行业管理更简单

概述 智慧工地管理平台面向房建、能源、交通各类工地的管理者,通过AI视频、物联感知技术对工地场景中的施工机械、建筑材料、施工规范、施工环境监管、完善施工现场项目管控。实现项目管控、特种设备管理、绿色施工、工地巡检等业务功能,沉淀工地监管数…

03_Web开发基础之综合应用

web开发基础之综合使用 学习目标和内容 1、能够描述jQuery的作用 2、能够使用jQuery的选择器获取元素 3、能够使用jQuery对HTML标签元素注册事件 4、能够使用jQuery对HTML元素的属性进行操作 5、能够描述Bootstrap的作用 6、能够使用Bootstrap创建简单网页 7、能够描述AJAX的作…

微信小程序置顶导航,替代原生导航栏

效果图&#xff1a; 思路&#xff1a;Navigation是小程序的顶部导航组件&#xff0c;当页面配置navigationStyle设置为custom的时候可以使用此组件替代原生导航栏&#xff0c;wx.getSystemInfoSync获取可使用窗口高度 wxml代码&#xff1a; <!-- 头部 --> <view cla…

MySQL执行流程_执行一条select语句,期间发生了什么

文章目录 执行一条select语句&#xff0c;期间发生了什么MySQL执行流程第一步&#xff1a;连接器第二步&#xff1a;查询缓存第三步&#xff1a;解析SQL第四步&#xff1a;执行SQL 执行一条select语句&#xff0c;期间发生了什么 MySQL执行流程 server层负责建立连接、分析和执…

windows下使用logstash同步跨网络集群的数据

我们在开发环境过程中&#xff0c;可能会遇到这样的场景。我们可以通过VPN访问远端的机房。有可能还要跨机房访问。这篇文章演示使用logstash&#xff0c;在windows上&#xff0c;去同步跨网络环境的不同机房之间的数据。 此方式受网络限制。适合同步小规模数据。 下载logstash…

HarmonyOS给应用添加消息通知

给您的应用添加通知 通知介绍 通知旨在让用户以合适的方式及时获得有用的新消息&#xff0c;帮助用户高效地处理任务。应用可以通过通知接口发送通知消息&#xff0c;用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用&#xff0c;通知主要有以下使用场景…

Leetcode的AC指南 —— 链表:面试题 02.07. 链表相交

摘要&#xff1a; Leetcode的AC指南 —— 链表&#xff1a;面试题 02.07. 链表相交。题目介绍&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 文章目录 一、题目二、…

Windows安装Tesseract OCR与Python中使用pytesseract进行文字识别

文章目录 前言一、下载并安装Tesseract OCR二、配置环境变量三、Python中安装使用pytesseract总结 前言 Tesseract OCR是一个开源OCR&#xff08;Optical Character Recognition&#xff09;引擎&#xff0c;用于从图像中提取文本。Pytesseract是Tesseract OCR的Python封装&am…

LeetCode(68)翻转二叉树【二叉树】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 翻转二叉树 1.题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1…

计网 - TCP扫盲

文章目录 知识点TCP头格式TCP有限状态机&#xff08;FSM&#xff09;为何需要TCP协议TCP的定义TCP连接的概念如何唯一确定一个TCP连接TCP vs UDPTCP拥塞控制TCP流量控制 导图 知识点 TCP头格式 TCP头部包含多个字段&#xff0c;其中一些是必需的&#xff0c;而另一些是可选的…

AVL树-详细解析【数据结构】

AVL树是首个被发明的自平衡二叉查找树&#xff0c;在1962年由两位苏联科学家G.M. Adelson-Velsky和E.M. Landis提出。AVL树得名于发明者的首字母。在AVL树中&#xff0c;任何节点的两个子树的高度最大差别为一&#xff0c;确保了树的平衡度&#xff0c;使得查找操作相比于普通的…

2023 亚马逊云科技 re:Invent 大会探秘:Aurora 无限数据库的突破性应用

文章目录 一、前言二、Amazon Aurora 无限数据库2.1 亚马逊云科技数据库产品发展历程2.2 什么是 Amazon Aurora Limitless Database&#xff08;无限数据库&#xff09;2.3 Amazon Aurora Limitless Database 设计架构2.4 Amazon Aurora Limitless Database 分片功能2.5 使用 A…

微服务最佳实践:构建可扩展且高效的系统

微服务架构彻底改变了现代软件开发&#xff0c;提供了无与伦比的敏捷性、可扩展性和可维护性。然而&#xff0c;有效实施微服务需要深入了解最佳实践&#xff0c;以充分发挥微服务的潜力&#xff0c;同时避免常见的陷阱。在这份综合指南中&#xff0c;我们将深入研究微服务的关…

WEB 3D技术 简述React Hook/Class 组件中使用three.js方式

之前 已经讲过了 用vue结合three.js进行开发 那么 自然是少不了react 我们 还是先创建一个文件夹 终端执行 npm init vitelatest输入一下项目名称 然后技术选择 react 也不太清楚大家的基础 那就选择最简单的js 然后 我们就创建完成了 然后 我们用编辑器打开创建好的项目目…