【vuejs】vue2项目中封装组件的分析以及常用方式和属性讲解

1. 组件封装的目的与优势

1.1 提升开发效率

组件封装是Vue.js开发中的一种常见实践,其核心目的在于提高开发效率。通过将通用的功能和界面元素抽象成独立的组件,开发者可以在不同的项目和业务场景中重复使用这些组件,从而减少重复编写代码的工作量。

封装的组件通常具备以下特点:

  • 高复用性:组件可以在多个地方使用,减少了代码冗余。
  • 快速迭代:当组件需要更新或修复时,只需改动一处,所有使用该组件的地方都会得到更新。
  • 简化开发流程:开发者可以专注于组件的单一职责,简化了开发和调试过程。

例如,一个数据表格组件可以封装分页、排序和数据展示等功能,开发者在使用时只需传递相应的数据和配置即可,无需从头开始编写表格逻辑。

1.2 增强代码可维护性

封装组件不仅提升了开发效率,同时也增强了代码的可维护性。当项目规模逐渐扩大,代码的组织和维护成为一大挑战。组件化可以使代码结构更加清晰,每个组件负责一项具体的功能,易于理解和维护。

此外,组件封装还带来了以下优势:

  • 解耦合:组件之间的依赖性降低,修改一个组件不会影响到其他组件。
  • 易于测试:独立封装的组件可以单独进行单元测试,提高了测试的覆盖率和质量。
  • 团队协作:在多人开发的大型项目中,组件化有助于团队成员之间的协作,每个成员可以专注于特定组件的开发,减少代码冲突。

例如,一个表单组件可以封装输入验证、用户输入等逻辑,当需要在不同页面使用表单时,只需插入该组件并根据需要配置验证规则和样式,无需关心表单内部的复杂逻辑。这样既保证了代码的一致性,也简化了后期的维护工作。

2. 组件封装的基本原则

2.1 单一职责原则

单一职责原则(Single Responsibility Principle, SRP)是组件封装中的核心原则之一。它强调一个组件应该只负责一项任务或者功能。在Vue2开发中,这意味着每个组件应该只关注一件事情,这样做可以带来以下好处:

  • 易于理解:职责单一的组件更容易被理解和维护。
  • 易于测试:当组件只做一件事情时,可以更容易地编写针对该功能的测试用例。
  • 易于复用:单一职责的组件可以在不同的上下文中重复使用,因为它们不依赖于其他组件的状态或行为。

在Vue2中实现单一职责可以通过以下方式:

  • Props的使用:通过props将数据传递给组件,确保组件只关注如何展示数据而不是数据的来源。
  • 事件:使用事件($emit)来处理组件间的通信,而不是在组件内部直接修改外部状态。

2.2 高内聚低耦合

高内聚低耦合是组件设计时追求的另一个重要目标。高内聚意味着组件内部的功能紧密相关,形成一个整体;低耦合则意味着组件之间的依赖性应该尽可能小。

  • 高内聚:组件内部的方法、数据和模板应该紧密相关,共同协作完成单一职责。
  • 低耦合:组件应该尽量减少对外部状态的依赖,避免一个组件的更改影响到其他组件。

在Vue2中实现高内聚低耦合的方法包括:

  • 组件方法的封装:将相关的操作封装在组件的方法中,确保这些方法只处理组件内部的数据。
  • 使用计算属性和侦听器:利用Vue2的计算属性和侦听器来响应内部数据的变化,而不是依赖外部直接赋值。
  • 插槽(Slots):利用插槽来允许父组件向子组件注入内容,这样可以降低组件间的直接依赖。
  • 自定义指令:在需要对DOM进行复杂操作时,使用自定义指令可以保持组件的独立性,避免将逻辑硬编码在模板中。

遵循这些封装原则,可以创建出结构清晰、易于维护和复用的Vue2组件。

3. Vue2组件封装的步骤

3.1 定义组件模板

定义组件模板是封装过程的第一步。在Vue2中,模板是组件的声明式部分,它描述了组件的UI结构。模板可以包含HTML标签、组件自定义标签以及Vue指令。

  • 基本结构:每个组件模板都应遵循基本的HTML结构,包括<template>标签包裹的组件内容。
  • 组件复用:在模板中使用<component>标签来复用已有的Vue组件或HTML元素。
  • 动态组件:利用<component :is="...">可以实现组件的动态切换。
  • 条件渲染:使用v-ifv-else-ifv-elsev-show实现条件渲染,使组件能够根据不同条件显示不同内容。
  • 列表渲染:使用v-for指令对数组进行遍历,生成列表。

3.2 确定组件的props

Props是组件自定义的输入属性,它们允许我们将外部数据传递到组件内部。

  • Props定义:使用props选项明确定义组件接受的属性,包括属性类型、是否必填、默认值等。
  • 类型检查:Vue2支持使用JavaScript的构造函数来定义props的类型,如StringNumberBoolean等。
  • 自定义验证:可以编写自定义验证函数来进一步验证传入的props值是否满足特定条件。
  • 传递静态或动态数据:通过在父组件中使用v-bind或简写:来传递静态或动态计算的属性值给子组件。

3.3 处理组件事件与emit

事件系统是Vue中实现父子组件通信的重要机制。

  • 监听事件:在组件模板中使用v-on或简写@来监听原生DOM事件或Vue自定义事件。
  • 事件参数:通过在事件处理函数中传递额外的参数,可以将更多的信息传递给监听器。
  • 阻止默认行为:使用event.preventDefault()可以阻止事件的默认行为。
  • emit自定义事件:使用this.$emit来触发自定义事件,并可以传递数据给父组件。
  • 事件修饰符:Vue2提供了如.stop.prevent.capture等事件修饰符,简化事件处理逻辑。

通过上述步骤,可以构建出具有清晰结构、数据传递和事件处理能力的Vue2业务组件,从而提高开发效率和组件的可维护性。

4. 继承第三方组件属性

4.1 使用$attrs继承属性

在Vue2中,$attrs是一个包含父作用域中不作为prop被识别的attribute绑定的对象。利用$attrs可以继承第三方组件的属性,使得封装的组件更加灵活和可复用。

  • 属性透传:通过v-bind="$attrs",可以将未在props中声明的属性透传给子组件,这样封装的组件可以接收并应用来自父组件的任意属性。
  • 示例
    <template><el-select v-model="selected" v-bind="attrs"><el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option></el-select>
    </template><script>
    export default {name: 'TuiSelect',props: {options: {type: Array,required: true},value: {type: [String, Number],default: ''}},computed: {selected: {get() {return this.value;},set(val) {this.$emit('input', val);}},attrs() {return this.$attrs;}}
    };
    </script>
    

4.2 属性的默认值与类型

在封装组件时,为属性设置默认值和类型是非常重要的,这可以确保组件的健壮性和易用性。

  • 类型定义:使用type属性为props定义类型,Vue2会进行类型检查,提高代码的可维护性。
  • 默认值:通过default函数为props提供默认值,确保即使父组件未传入值,组件也能正常工作。
  • 示例
    <template><el-input v-model="inputValue" :placeholder="placeholder" :type="inputType" v-bind="attrs"><template v-for="(_, name) in $slots" v-slot:[name]><slot :name="name" /></template></el-input>
    </template><script>
    export default {name: 'TuiInput',props: {value: {type: String,default: ''},placeholder: {type: String,default: '请输入内容'},inputType: {type: String,default: 'text'}},computed: {inputValue: {get() {return this.value;},set(val) {this.$emit('input', val);}}}
    };
    </script>
    

通过上述方法,可以确保封装的Vue2组件能够灵活地继承第三方组件的属性,同时提供类型安全和默认值,使得组件更加健壮和易于使用。

5. 继承第三方组件事件

5.1 使用$listeners转发事件

在Vue 2中,继承第三方组件的事件是封装业务组件时常见的需求。通过$listeners对象,我们可以方便地将父组件的事件监听器传递给子组件,实现事件的透传。

  • $listeners 对象:它包含了父作用域中(不含 .native 修饰器的)v-on 事件监听器。这意味着我们可以捕获父组件绑定到子组件上的所有事件,并将它们转发到子组件内部的元素或组件上。

  • 基本用法:在子组件的模板中,我们可以使用v-on="$listeners"来将所有事件监听器应用到子组件的根元素或其他元素上。

<template><div v-on="$listeners"><!-- 子组件内容 --></div>
</template>
  • 事件透传:在实际应用中,我们可能需要将事件监听器应用到子组件内部的特定元素上。这时,我们可以在模板中指定元素,并使用v-on="$listeners['click']"这样的语法来绑定特定的事件。
<template><el-button v-on="$listeners">按钮</el-button>
</template>
  • 自定义事件处理:在某些情况下,我们可能需要在子组件中处理事件,然后再透传给父组件。这时,我们可以在子组件中定义一个方法来处理事件,并在$listeners中使用@符号来绑定自定义方法。
<template><div @click="handleClick"><!-- 子组件内容 --></div>
</template><script>
export default {methods: {handleClick(event) {// 处理点击事件this.$emit('click', event);},},
};
</script>
  • 避免重复事件处理:在使用$listeners时,需要注意避免在子组件中重复定义父组件已经定义的事件处理函数。这样可以确保事件处理逻辑的一致性,并减少不必要的代码重复。

  • 结合v-bind使用:在封装组件时,我们通常会结合v-bind$listeners来实现属性和事件的透传。这样可以确保子组件能够接收到父组件传递的所有属性和事件监听器。

<template><el-inputv-model="localValue"v-bind="$attrs"v-on="$listeners"></el-input>
</template><script>
export default {props: ['value'],computed: {localValue: {get() {return this.value;},set(newValue) {this.$emit('input', newValue);},},},
};
</script>

通过上述方法,我们可以在Vue 2中灵活地继承和转发第三方组件的事件,从而提高组件的复用性和灵活性。

6. 使用第三方组件的Slots

6.1 普通插槽与具名插槽

在Vue.js中,插槽(Slots)是一种用于组件内容分发的机制,它允许我们将内容从父组件传递到子组件的模板中。这种机制在开发可复用和灵活的业务组件时尤为重要。以下是对Vue 2中使用第三方组件的插槽机制的详细分析。

6.1.1 普通插槽的使用

普通插槽允许父组件将内容传递到子组件的模板中,而不需要指定插槽的名称。这在封装第三方组件时非常有用,因为它允许我们传递任意内容,而不仅仅是特定的数据。

  • 使用场景:当第三方组件提供了一个或多个插槽,但没有对插槽的内容进行限制时,可以使用普通插槽。
  • 示例
    <template><el-input><template v-slot:default><input type="text" :value="childValue" @input="onInput"></template></el-input>
    </template><script>
    export default {props: ['value'],computed: {childValue: {get() { return this.value },set(value) { this.$emit('input', value) }}},methods: {onInput(event) {this.childValue = event.target.value;}}
    };
    </script>
    
    在这个例子中,我们使用了Element UI的el-input组件,并利用普通插槽传递了一个input元素。

6.1.2 具名插槽的使用

具名插槽允许我们传递具有特定名称的内容,这些内容将被渲染到子组件模板中对应的具名插槽位置。这在封装具有多个插槽的第三方组件时非常有用。

  • 使用场景:当第三方组件提供了多个插槽,并且我们需要传递特定内容到这些插槽时,可以使用具名插槽。
  • 示例
    <template><el-card><template v-slot:title><h3>Card Title</h3></template><template v-slot:default><p>This is the card content.</p></template></el-card>
    </template>
    
    在这个例子中,我们使用了Element UI的el-card组件,并利用具名插槽title传递了标题内容,同时使用默认插槽传递了卡片的主要内容。

6.1.3 插槽的动态绑定

在某些情况下,我们可能需要根据条件动态地绑定插槽。Vue 2提供了v-slot指令的动态特性,允许我们根据表达式的结果来决定使用哪个插槽。

  • 使用场景:当需要根据不同的条件渲染不同的内容时,可以使用动态插槽。
  • 示例
    <template><el-card><template v-slot:[dynamicSlotName]><p>This is the dynamic slot content.</p></template></el-card>
    </template><script>
    export default {data() {return {dynamicSlotName: 'title'};}
    };
    </script>
    
    在这个例子中,我们使用了动态插槽名称dynamicSlotName来决定渲染哪个插槽的内容。

6.1.4 作用域插槽的使用

作用域插槽允许子组件将数据作为插槽的一部分传递回父组件,这样父组件可以访问到子组件中的数据,并在插槽内容中使用这些数据。

  • 使用场景:当需要在插槽内容中使用子组件中的数据时,可以使用作用域插槽。
  • 示例
    <template><el-table :data="tableData"><template v-slot:default="{ row }"><td>{{ row.date }}</td><td>{{ row.name }}</td><td>{{ row.address }}</td></template></el-table>
    </template><script>
    export default {data() {return {tableData: [{ date: '2016-05-03', name: 'Tom', address: 'No. 189, Grove St, Los Angeles' },// ...]};}
    };
    </script>
    
    在这个例子中,我们使用了Element UI的el-table组件,并利用作用域插槽访问了每一行的数据。

通过上述分析,我们可以看到,Vue 2中的插槽机制为开发灵活和可复用的业务组件提供了强大的支持。无论是普通插槽、具名插槽、动态插槽还是作用域插槽,都能够在不同的场景下满足我们的需求。

7. 封装组件的高级技巧

7.1 继承第三方组件的方法

封装Vue组件时,继承第三方组件是一种常见的需求,这可以让开发者利用现有的组件功能,同时扩展或覆盖它们的特性以满足特定的业务需求。以下是一些继承第三方组件的方法和技巧:

  1. 使用$attrs$listeners

    • $attrs:包含父作用域中不作为prop被识别的attribute绑定(class和style除外)。通过v-bind="$attrs"可以传递给内部的UI库组件。
    • $listeners:包含父作用域中的(不含.native修饰器的)v-on事件监听器。通过v-on="$listeners"可以转发传入内部组件。
  2. 使用$slots$scopedSlots

    • $slots:获取非作用域的插槽,可以循环渲染对应的普通具名插槽。
    • $scopedSlots:获取作用域插槽,可以结合动态插槽名的用法,循环作用插槽位置和传递对应的参数。
  3. 继承组件的事件

    • 通过$emit手动触发事件,或者利用$listeners自动转发事件。
  4. 继承组件的方法

    • 通过this.$refs获取第三方组件的实例,然后扩展当前组件的方法,使其包含第三方组件的方法。
  5. 使用provideinject

    • provide:允许祖先组件向其所有子孙组件提供数据。
    • inject:允许子孙组件从祖先组件中获取数据。
  6. 动态组件和v-model

    • 利用v-model实现父子组件的数据同步。
    • 使用动态组件实现组件的动态切换。
  7. 封装和扩展Element UI组件

    • 以Element UI组件为例,可以通过继承其属性和事件,结合$attrs$listeners实现封装。
  8. 使用Mixins和Components

    • Mixins可以包含可复用的选项,组件可以通过mixins来继承这些选项。
  9. 处理样式和类

    • 使用classstyle绑定,结合计算属性或方法,动态生成组件的样式。
  10. 组件通信

    • 利用事件总线(Event Bus)或Vuex实现组件间的通信。

通过上述方法,开发者可以更灵活地封装和扩展第三方组件,以适应不同的业务场景和需求。在实际开发中,应根据具体需求选择合适的继承和封装策略。

如果这篇文章对你有所帮助,欢迎点赞、分享和留言,让更多的人受益。感谢你的细心阅读,如果你发现了任何错误或需要补充的地方,请随时告诉我,我会尽快处理。

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

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

相关文章

国产精品ORM框架-SqlSugar详解 SqlSugar初识 附案例源码 云草桑 专题一

国产精品ORM框架-SqlSugar详解 1、SqlSugar初识 2、开始实操 3、增删改操作 4、进阶功能 5、集成整合 6、脚手架应用 sqlsugar 官网-CSDN博客 国产精品ORM框架-SqlSugar详解 SqlSugar初识 专题二-CSDN博客 1、SqlSugar初识 1.1 基本概念和历史 SqlSugar 是一款 老牌 …

vim网络和安全的操作及shell的使用

目录 vim模式 一般模式下的基本操作&#xff1a; 一般模式切换到编辑模式&#xff1a; 一般模式切换到命令模式&#xff1a; Vim多窗口使用技巧 横向切割打开&#xff1a; 纵向切割打开&#xff1a; 关闭多窗口&#xff1a; 窗口的切换&#xff1a; 网络&#xff1a;…

milvus分批写入测试数据

milvus分批写入测试数据 场景: 假如现在需要向milvus写入500W数据&#xff0c;调用milvus的insert api一次性写入500W数据是不现实的&#xff0c;内存也吃不消。 这时候需要分批写入&#xff0c;例如每次写入1000行&#xff0c;直至写完500W数据。 实现代码如下: package …

PostgreSQL 慢 SQL 排查

作者&#xff1a;文若 前言 所谓慢SQL 是指在数据库中执行时间超过指定阈值的语句。慢查询太多&#xff0c;对于业务而言&#xff0c;是有很大风险的&#xff0c;可能随时都会因为某种原因而被触发&#xff0c;并且根据我们的经验&#xff0c;数据库最常出现的问题&#xff0…

《大数据基础》相关知识点及考点,例题

1.6大数据计算模式 1、MapReduce可以并行执行大规模数据处理任务&#xff0c;用于大规模数据集&#xff08;大于1TB&#xff09;的并行运算。MapReduce 极大地方便了分布式编程工作&#xff0c;它将复杂的、运行于大规模集群上的并行计算过程高度地抽象为两个函数一一Map和Redu…

[MySQL][复核查询][多表查询][自连接][自查询]详细讲解

目录 1.铺垫&基本查询回顾1.多表查询1.何为笛卡尔积&#xff1f;2.示例 2.自连接1.何为自连接&#xff1f;2.示例 3.子查询1.何为子查询&#xff1f;2.单行子查询3.多行子查询4.多列子查询5.在from子句中使用子查询6.合并查询 1.铺垫&基本查询回顾 前面讲解的MYSQL表的…

OPPO 2024届校招正式批笔试题-后端(C卷)

小欧的括号嵌套 题目描述 小欧想要构造一个合法的括号序列满足以下条件&#xff1a; 括号序列长度恰好为 2 n 2n 2n。括号序列的嵌套层数最大值为 r r r。 括号嵌套层数是指在一个字符串中&#xff0c;以左括号 “(” 和右括号 “)” 形成的括号对的最大嵌套深度。 输入…

获取欧洲时报中国板块前新闻数据-scrapy

这里写目录标题 1.创建项目文件二.爬虫文件编写三.管道存储四.settings文件 1.创建项目文件 创建scrapy项目的命令&#xff1a;scrapy startproject <项目名字> 示例&#xff1a; scrapy startproject myspiderscrapy genspider <爬虫名字> <允许爬取的域名>…

联邦学习(Federated learning)—— 去中心化联邦中心化联邦

提出联邦学习的目的&#xff1a;解决数据孤立问题和安全隐私问题。 联邦学习的主要思想&#xff1a;基于分布在多个设备上的数据集构建机器学习模型&#xff0c;同时防止数据泄露。&#xff08;是一种分布式机器学习方法&#xff09; 联邦学习架构 联邦学习的架构分为两种&…

修改了mybatis的xml中的sql不重启服务器如何动态加载更新

目录 一、背景 二、注意 三、代码 四、使用示例 五、其他参考博客 一、背景 开发一个报表功能&#xff0c;好几百行sql&#xff0c;每次修改完想自测下都要重启服务器&#xff0c;启动一次服务器就要3分钟&#xff0c;重启10次就要半小时&#xff0c;耗不起时间呀。于是在…

windows docker nvidia wsl2

下载驱动(GeForce Experience里的也可以)https://www.nvidia.cn/Download/index.aspx 安装wsl2https://blog.csdn.net/qq_39942341/article/details/121512900?ops_request_misc%257B%2522request%255Fid%2522%253A%2522172122816816800227436617%2522%252C%2522scm%2522%253A…

Docker构建LNMP环境并运行Wordpress平台

1.准备Nginx 上传文件 Dockerfile FROM centos:7 as firstADD nginx-1.24.0.tar.gz /opt/ COPY CentOS-Base.repo /etc/yum.repos.d/RUN yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c make && \useradd -M -s /sbin/nologin nginx && \cd /o…

沙尘传输模拟教程(基于wrf-chem)

沙尘传输模拟教程(基于wrf-chem) 文章目录 沙尘传输模拟教程(基于wrf-chem)简介实验目的wrf-chem简介 软件准备wps、wrf-chem安装conda安装ncl安装ncap安装 数据准备气象数据准备下垫面数据准备 WPS数据预处理namelist.wps的设置geogrid.exe下垫面处理ungrib.exe气象数据预处理…

docker替换主程序排错

docker替换主程序排错 背景&#xff1a;经常会遇到主程序启动错误&#xff0c;导致无法进入到容器内部排错。 替换命令 docker run --rm -it --entrypoint/bin/sh 镜像名

石油与化工行业的工业互联网平台革新之路

石油和化工工业互联网平台的变革是近年来工业发展的重要趋势之一&#xff0c;它基于工业互联网技术&#xff0c;通过数字化、网络化和智能化手段&#xff0c;推动石油和化工行业的转型升级。以下是关于石油和化工工业互联网平台变革的详细分析&#xff1a; 一、革新背景 行业…

@Valid校验前端参数

1、导入依赖。&#xff08;springmvc的stater-web和json依赖也需要添加&#xff0c;此处先不列举&#xff09; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependen…

批量下载网易云音乐歌单的Python脚本

在日常的音乐收藏和整理中,有时候我们希望能够快速地备份或下载网易云音乐中的歌曲,以便在没有网络连接的情况下也能随时听到自己喜欢的音乐。这时候,Python可以提供一种便捷的解决方案,让我们能够轻松地实现这一目标。 技术背景 本文介绍的Python脚本利用了Requests库和…

SpringSecurity + JWT 实现登录认证

目录 1. JWT 的组成和优势 2. JWT 的工作原理 2.1 生成 JWT 2.2 传输JWT 3. SpringSecurity JWT 实现登录认证 3.1 配置 Spring Security 安全过滤链 3.2 自定义登录认证过滤器 3.3 实现SpringSecurity用户对象 3.4 获取当前登录用户 1. JWT 的组成和优势 JWT 由三…

SSE(Server Sent Event)实战(3)- Spring Web Flux 实现

上篇博客 SSE&#xff08;Server Sent Event&#xff09;实战&#xff08;2&#xff09;- Spring MVC 实现&#xff0c;我们用 Spring MVC 实现了简单的消息推送&#xff0c;并且留下了两个问题&#xff0c;这篇博客&#xff0c;我们用 Spring Web Flux 实现&#xff0c;并且看…

STM32(六):STM32指南者-定时器实验

目录 一、基本概念1、常规定时器2、内核定时器 二、基本定时器实验1、实验说明2、编程过程&#xff08;1&#xff09;配置LED&#xff08;2&#xff09;配置定时器&#xff08;3&#xff09;设定中断事件&#xff08;4&#xff09;主函数计数 3、工程代码 三、通用定时器实验实…