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

探索Vue的组件世界-组件复用

目录

Mixin【混入】

缺陷

HOC(higher order component)【高阶组件】

相比较Mixin的优点:

不足:

Renderless组件【函数式组件,无渲染组件,Vue社区使用比较多的一种业务复用模式】

优点:


  1. Mixins:混入 (mixins): 是一种分发 Vue 组件中可复用功能的非常灵活的方式。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被混入该组件本身的选项。
  2. HOC(higher order component)【高阶组件】:高阶组件(HOC)是React中用于复用组件逻辑的一种高级技巧。HOC自身并不是React API的一部分,它是一种基于React的组合特性而形成的设计模式。高阶组件听起来挺唬人的,只看名字恐怕不是那么容易明白究竟是何物,而且通常来讲高阶组件并不是组件,而是接受组件作为参数,并且返回组件的函数。
  3. Renderless组件:函数式组件,无渲染组件

Mixin【混入】

<template><div><input type="text" @blur="blur" />{{ errmsg }}</div>
</template>
<script>
import validateMixin from "./mixin";
export default {mixins: [validateMixin],// 之影响这一个页面,单个页面混入data: () => ({ errmsg: "" }),methods: {blur() {this.validate();        }    }
}
</scrpit>

 validateMixin

export default {methods: {validate() {/*** 校验逻辑*/return true;                               	        }    }
}
  • 同名钩子函数将合并为一个数组,混入对象的钩子将在组件自身钩子之前调用。
  • 二者的methods、components和directives【自定义指令】,将被合并为同一个对象。若对象键名冲突时,取组件对象的键值对(mixin里面的同名【键名】会丢失)

缺陷

  • 打破了原有组件的封装
  • 增加组件复杂度
  • 可能会出现命名冲突的问题
  • 仅仅只是对逻辑的复用,模板不能复用(假如什么示例中errmsg由minxin中的validate返回,那就需要在每个用到的页面写模板)

HOC(higher order component)【高阶组件】

高阶函数的应用,装饰者模式的一种实现

HOC:函数接收一个组件作为参数,并返回一个新组件;可复用的逻辑在函数中实现

 

 App.vue文件

<template><div id="app"><img width="25%" src="./assets/logo.png"><validate-input :rules="rules"/></div>
</template>
<script>
import CustomInput from "./components/CustomInput";
import ValidateHoc from "./components/hoc.js";
const ValidateInput = ValidateHoc(CustomInput);
export default {name: "App",data() {return {rules: [{test: function(value) {return /\d+/.test(value);},message: "请输入一个数字"}]};},components: {ValidateInput}
};
</script>
<style>
#app {font-family: "Avenir", Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 60px;
}
</style>

CustomInput.vue文件

<template><input type="text" @blur="$emit('blur', value)" v-model="value">
</template>
<script>
export default {props: ["initValue"],data() {return {value: this.initValue};}
};
</script>

hoc.js文件

const ValidateHoc = Component => ({name: `hoc-${Component.name}`,props: ["rules"],data() {return {errMsg: "",value: ""};},methods: {validate(value) {this.value = value;let validate = this.rules.reduce((pre, cur) => {let check = cur && cur.test && cur.test(this.value);this.errMsg = check ? "" : cur.message;return pre && check;}, true);return validate;}},render() {console.log(this.value);return (<div><Component on-blur={this.validate} initValue={this.value} />{this.errMsg || ""}</div>);}
});
export default ValidateHoc;

相比较Mixin的优点:

  • 模板可复用
  • 不会出现命名冲突(本质上是HOC是套了一层父组件)

不足:

  • 组件复杂度高,多层嵌套,调试会很痛苦

Renderless组件【函数式组件,无渲染组件,Vue社区使用比较多的一种业务复用模式】

  • 复用的逻辑沉淀在包含slot插槽的组件
  • 接口由插槽Prop来暴露

左面子组件,右面是复用逻辑

 SBody.vue文件【子组件】

<template><div>// 暴露出插槽Prop方法【validate】<s-validate #default="{ validate }" :value="value" :rules="rules">// 调用暴露出插槽Prop方法【validate】<input type="text" @blur="validate" v-model="value" /></s-validate><s-validate #default="{ validate }" :value="text" :rules="textRules"><textarea type="text" @blur="validate" v-model="text" /></s-validate></div>
</template>
<script>
import SValidate from "./SValidate";
export default {data: () => ({value: "hi",text: "hi",rules: [{test: function(value) {return /\d+/.test(value);},message: "请输入一个数字"}],textRules: [{test: function(value) {return value;},message: "请输入一个非空的值"}]}),components: {SValidate}
};
</script>

SValidate.vue【复用逻辑】

<template><div><slot :validate="validate"></slot>{{ errMsg }}</div>
</template>
<script>
export default {props: ["value", "rules"],data() {return { errMsg: "" };},methods: {validate() {let validate = this.rules.reduce((pre, cur) => {let check = cur && cur.test && cur.test(this.value);this.errMsg = check ? "" : cur.message;return pre && check;}, true);return validate;}}
};
</script>

优点:

  • 模板可复用
  • 不会出现命名冲突
  • 符合依赖倒置原则
  • 复用的接口来源清晰

相关文章:

探索Vue的组件世界-组件复用

目录 Mixin【混入】 缺陷 HOC&#xff08;higher order component&#xff09;【高阶组件】 相比较Mixin的优点&#xff1a; 不足&#xff1a; Renderless组件【函数式组件&#xff0c;无渲染组件&#xff0c;Vue社区使用比较多的一种业务复用模式】 优点&#xff1a; M…...

OMA通道-2

1 简介 本文档中指定的 API 使移动应用程序能够访问移动设备中的不同 SE&#xff0c;例如 SIM 或嵌入式 SE。 本规范提供了接口定义和 UML 图&#xff0c;以允许在各种移动平台和不同的编程语言中实现。 如果编程语言支持命名空间&#xff0c;则它应为 org.simalliance.openmob…...

SAP 用CO13冲销工序报工,但是没有产生货物移动(TCODE:CO1P 、 SE38 :CORUPROC,CORUAFWP)

前言 通常情况下&#xff0c;对PPO做GI或GR的时候&#xff0c;出现的异常可以在COGI中间被列出&#xff1b;在这些数据进入COGI之前&#xff0c;系统会把这些数据记录在CO1P中&#xff1b;换句话说&#xff0c;系统有时会出现DB的更新延时&#xff0c;当延时发生的时候&#xf…...

信息收集-服务器信息

服务器上面可以运行大量的系统服务和第三方应用服务&#xff0c;如果操作系统或者第三方软件没有及时升级打补丁&#xff0c;攻击者就有可能直接通过服务器上运行的服务进行攻击。 服务器需要收集的信息包含三个方面&#xff1a; 操作系统信息等识别waf&#xff08;Web应用程…...

连续签到积分兑换试用流量主小程序开发

每日签到积分兑换试用流量主小程序开发 打卡兑奖小程序。用户签到活得积分。积分可以兑换商品。观看激励视频广告可以积分翻倍。 用户可以参加试用商品活动参加试用需要提交信息。可以通过分享方式直接获取试用资格。 以下是流量主小程序的功能列表&#xff1a; 广告位管理&a…...

C语言—自定义类型(结构体、枚举、联合)

自定义类型 结构体结构体的声明特殊的声明结构的自引用结构体变量的定义和初始化结构体内存对齐修改默认对齐数offsetof宏 结构体传参 位段位段的定义&#xff08;声明&#xff09;位段的内存分配位段的跨平台问题位段的应用 枚举枚举类型的定义及使用枚举的优点 联合&#xff…...

Node.js博客项目开发思路笔记

博客项目介绍 1. 目标 开发一个博客系统&#xff0c;具备博客基本功能只开发 server 端&#xff0c;不关心前端 2. 需求 首页、作者页、博客详情页登陆页管理中心、新建页、编辑页 3. 技术方案 数据如何存储 博客 idtitlecontentcreatetimeauthor1标题 1内容 11111112z…...

python 之 shutil 文件的复制、删除、移动文件以及目录,并支持文件的归档、压缩和解压

一、shutil shutil 模块于文件和文件集合的高级操作&#xff0c;包括&#xff1a;复制、删除、移动文件以及目录&#xff0c;并支持文件的归档、压缩和解压等 二、使用例子 复制文件及权限 shutil.copy(src, dst)复制文件及权限&#xff1b;src 和 dst 文件路径。dst 文件名或…...

jface

JFace 是建立在 SWT 之上的 UI 部件&#xff0c;它是 SWT 的扩展并能和SWT交互。 ApplicationWindow和Action org.eclipse.jface.window.ApplicationWindow; JFace为了简化窗口的设计特别设计了类&#xff0c;比如ApplicationWindow这一个类&#xff0c;它里面包含了六个默认…...

六级备考28天|CET-6|听力第一讲|基本做题步骤与方法|13:30~14:30

目录 1. 重点词汇 proofread / ˈpruːfriːd / v.校对&#xff0c;校阅 autonomous adj.独立的 obsession n. 喜好 ample …...

系统设计 - 设计一个速率限制器

实施速率限制器的位置主要取决于我们的应用程序、技术栈、技术团队等因素。通常有三个位置可供选择&#xff1a;客户端、服务器端或中间件。 客户端是不可靠的地方来执行速率限制&#xff0c;因为恶意行为者可以轻易伪造客户端请求。 比将速率限制器放在服务器端更好的方法是使…...

[技术分享]Android平台实时音视频录像模块设计之道

实现背景 录像有什么难的&#xff1f;无非就是数据过来&#xff0c;编码保存mp4而已&#xff0c;这可能是好多开发者在做录像模块的时候的思考输出。是的&#xff0c;确实不难&#xff0c;但是做好&#xff0c;或者和其他模块有非常好的逻辑配合&#xff0c;确实不容易。 好多…...

JDKMissionControl官方用户指南--人工翻译

1. JMC8新增功能 暂时用不到&#xff0c;暂略 2. JDK Mission Control是什么 JMC是一组高级工具&#xff0c;用于管理、监视、分析Java应用程序并排除其故障。JMC能够对代码性能、内存和延迟等领域进行高效而详细的数据分析&#xff0c;而不会引入通常与分析和监控工具相关的…...

MySql-高级(分库分表问题简析) 学习笔记

文章目录 1. 为什么要分库分表&#xff1f;2. 用过哪些分库分表中间件&#xff1f;不同的分库分表中间件都有什么优点和缺点&#xff1f;3. 你们具体是如何对数据库如何进行垂直拆分或水平拆分的&#xff1f;4. 分库分表时&#xff0c;数据迁移方案5. 如何设计可以动态扩容缩容…...

【5.20】五、安全测试——安全测试工具

目录 5.4 常见的安全测试工具 1. Web漏洞扫描工具——AppScan 2. 端口扫描工具——Nmap 3. 抓包工具——Fiddler 4. Web渗透测试工具——Metasploit 小提示&#xff1a;Kali Linux 5.4 常见的安全测试工具 安全测试是一个非常复杂的过程&#xff0c;测试所使用到的工具也…...

【13900k】i9 核显升级驱动

这里写自定义目录标题 官方的助手不能用显卡控制中心提示最新的更新搜索显卡 intel uhd graphics 770 手动下载安装自定义音频为啥也要卸载&#xff1f;新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片…...

使用Python将绿色转换为红色、红色转换为蓝色的图像处理

使用Python将绿色转换为红色、红色转换为蓝色的图像处理 在图像处理中&#xff0c;我们经常需要对图像进行颜色转换和修改。本篇博客介绍了如何使用Python的Pillow库来读取一个文件夹中的所有图像&#xff0c;并将其中的绿色转换为红色&#xff0c;红色转换为蓝色。我们还展示…...

Web2与Web3开发的不同之处

Web2是引入交互功能的第二代互联网&#xff0c;也是我们今天所熟悉的。随着Web的不断发展&#xff0c;第三代互联网&#xff0c;也被称为Web3&#xff0c;正处于积极开发中。Web3引入了在区块链上运行的去中心化和无需许可的系统。但是Web2和Web3开发之间有什么区别呢&#xff…...

递增数组的判断【python实现】

有时候需要对某一组数组的数据进行判断是否 递增 的场景&#xff0c;比如我在开发一些体育动作场景下&#xff0c;某些肢体动作是需要持续朝着垂直方向向上变化&#xff0c;那么z轴的值是会累增的。同理&#xff0c;逆向考虑&#xff0c;递减就是它的对立面。 下面是查找总结到…...

在自定义数据上训练 YOLOv8 实例分割

图像分割是一个核心视觉问题,可以为大量用例提供解决方案。从医学成像到分析流量,它具有巨大的潜力。实例分割,即对象检测+分割,甚至更强大,因为它允许我们在单个管道中检测和分割对象。为此,Ultralytics YOLOv8 模型提供了一个简单的管道。在本文中,我们将对自定义数据…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中&#xff0c;从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备&#xff08;如专用硬件设备&#xff09;&#xff0c;从而消除了直接物理连接的需要。USB over IP的…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

Android屏幕刷新率与FPS(Frames Per Second) 120hz

Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数&#xff0c;单位是赫兹&#xff08;Hz&#xff09;。 60Hz 屏幕&#xff1a;每秒刷新 60 次&#xff0c;每次刷新间隔约 16.67ms 90Hz 屏幕&#xff1a;每秒刷新 90 次&#xff0c;…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时&#xff0c;遇到编译buildroot失败&#xff0c;提示如下&#xff1a; 提示缺失expect&#xff0c;但是实测相关工具是在的&#xff0c;如下显示&#xff1a; 然后查找借助各个ai工具&#xff0c;重新安装相关的工具&#xff0c;依然无解。 解决&am…...

第14节 Node.js 全局对象

JavaScript 中有一个特殊的对象&#xff0c;称为全局对象&#xff08;Global Object&#xff09;&#xff0c;它及其所有属性都可以在程序的任何地方访问&#xff0c;即全局变量。 在浏览器 JavaScript 中&#xff0c;通常 window 是全局对象&#xff0c; 而 Node.js 中的全局…...

VUE3 ref 和 useTemplateRef

使用ref来绑定和获取 页面 <headerNav ref"headerNavRef"></headerNav><div click"showRef" ref"buttonRef">refbutton</div>使用ref方法const后面的命名需要跟页面的ref值一样 const buttonRef ref(buttonRef) cons…...

Heygem50系显卡合成的视频声音杂音模糊解决方案

如果你在使用50系显卡有杂音的情况&#xff0c;可能还是官方适配问题&#xff0c;可以使用以下方案进行解决&#xff1a; 方案一&#xff1a;剪映替换音色&#xff08;简单适合普通玩家&#xff09; 使用剪映换音色即可&#xff0c;口型还是对上的&#xff0c;没有剪映vip的&…...