vue2之混入(mixin)

Vue 2 的混入(Mixin)是一种在 Vue 组件中分发可复用功能的方式。通过混入,你可以将一些通用的组件选项(如数据、方法、计算属性、生命周期钩子等)提取到一个混入对象中,并在多个组件中重用这些选项,从而实现代码复用和组织。

混入的基础用法

在 Vue 2 中,你可以使用 Vue.mixin() 方法全局注册一个混入对象,这样该混入对象中的选项将被添加到所有 Vue 实例和组件中。另外,你也可以在组件定义时使用 mixins 选项来局部注册一个或多个混入对象。

上例子

代码结构关系如下:

index.vue

<template>
<div><School /><hr><Student />
</div>
</template><script>
import Student from './student.vue'
import School from './school.vue'
export default {components: {Student,School},data () {return {}},}
</script><style scoped></style>

 school.vue

<template><div><h2 @click="showName">学校名称:{{ name }}</h2><h2>学校地址:{{ address }}</h2></div></template><script>//引入混入import maxin from '../../mixin.js'import {mixin2} from '../../mixin.js'export default {name: 'School',data() {return {name: '高级中学',address: '阳平镇',x:10};},//生命周期冲突时,同时使用,而且混入的优先级高于组件本身mounted() {console.log(this.x);},mixins: [maxin,mixin2],}</script><style scoped></style>

student.vue

<template><div><h2 @click="showName">学生姓名:{{ name }}</h2><h2>学生性别:{{ sex }}</h2></div></template><script>import maxin from '../../mixin.js'export default {name: 'Student',data() {return {name: '张三',sex: '男',age: 18};},mixins: [maxin],}</script><style scoped></style>

上面就是一个父组件和两个子组件的关系,在index.vue中使用了school和student组件。

对于混入呢,其实就是两个重点

①分发 Vue 组件的可复用功能

②解决冲突

(1)分发 Vue 组件的可复用功能

将上面两个子组件的点击事件移入到混入中

建立mixin.js文件

const maxin= {methods: {showName() {alert(this.name);}},mounted() {console.log('你好,世界');}}export const mixin2={data(){return{name:'mixin2',x:100,y:800}}}export default maxin;

这样界面中的点击效果依然可以正常使用

 当时做到这里我就发现了,提取公共的可复用功能,这不是就是vue3的自定义hooks吗?事实证明,vue3中使用了组合式API和自定义hooks,就不再使用mixin了。

Vue 3 引入了 Composition API,这是一种新的、可选的 API,用于组织和重用 Vue 组件的逻辑。Composition API 的主要优势在于其提供了比混入 (mixin) 更直观、更灵活的方式来组织和共享代码。以下是为什么 Vue 3 使用 Composition API 后,可能不再需要混入的一些原因:

  1. 更好的逻辑复用:混入允许你在多个组件之间共享代码,但当混入变得复杂时,很难跟踪哪些组件使用了哪些混入的逻辑。Composition API 通过自定义的 hooks(函数)来复用逻辑,这些 hooks 可以明确地在需要的组件中导入和使用,从而提供了更清晰的复用机制。

  2. 更直观的状态管理:在混入中,来自不同混入的对象属性可能会发生冲突,尤其是当它们有相同的名称时。Composition API 通过使用 refreactive 和 computed 等函数来创建响应式状态,这些状态是局部的,并且只在 setup 函数内部或其返回的模板中使用,从而避免了名称冲突的问题。

  3. 更灵活的代码组织:混入通常会将不同的逻辑片段(如生命周期钩子、方法等)分散到多个混入对象中。这可能会导致代码难以理解和维护。Composition API 允许你将相关的逻辑组织在同一个 setup 函数或自定义 hook 中,使代码更加集中和模块化。

  4. 更好的类型支持:TypeScript 用户在使用混入时可能会遇到类型推断的问题,因为混入的属性和方法可能会与组件自己的属性和方法混合在一起。而 Composition API 与 TypeScript 结合得更好,因为它允许你明确地定义和返回响应式状态和函数,从而更容易进行类型检查和推断。

  5. 更少的魔法:混入的工作方式有时会被视为“魔法”,因为它会在组件背后默默地添加属性和方法。这可能会导致调试困难或不可预测的行为。相比之下,Composition API 更加显式,你明确地知道哪些逻辑被添加到了组件中。

 (2)解决冲突

那可能就会有一个疑问,如果混入中的data中的数据和组件自身的数据冲突了怎么办?

答案就是,这种情况下,以组件自身的为主。

我们可以看到,以组件自身的数据为主

 

还有一种特殊一点的情况,就是生命周期,如果组件和混入都使用了相同的生命周期,那么两种声明周期种的代码将都会保留,并且执行顺序是先混入,后组件自身。

 

混入的合并策略

当组件和混入对象包含相同的选项时,Vue 会使用特定的合并策略来处理这些冲突。以下是一些常见的合并策略:

  • 数据对象(data):组件自身的数据对象和混入对象的数据对象是合并的,以组件自身的数据优先。如果键名冲突,组件自身的数据将覆盖混入对象中的数据。

  • 生命周期钩子(如 created、mounted 等):混入对象的钩子函数将在组件自身的钩子函数之前调用。这些钩子函数不会合并成一个数组,而是会依次执行。这意味着你可以利用混入来在组件的生命周期钩子之前或之后执行一些额外的逻辑。

  • 方法(methods)计算属性(computed) 和 侦听器(watchers):如果组件和混入对象定义了相同名称的方法、计算属性或侦听器,组件自身的定义将优先,并且会覆盖混入对象中的定义。

混入的注意事项

虽然混入提供了一种灵活的方式来复用代码,但在使用时也需要注意以下几点:

  • 命名冲突:由于混入对象的选项会与组件的选项合并,因此需要小心处理命名冲突的情况。为了避免潜在的冲突,最好使用具有明确含义和独特性的命名。

  • 依赖关系:混入对象之间可能存在依赖关系,这可能导致复杂的依赖链和难以预测的行为。因此,在使用多个混入对象时,需要确保它们之间的依赖关系是清晰和可控的。

  • 代码可读性:过度使用混入可能会导致代码变得难以阅读和理解。因此,在使用混入时,需要权衡代码的复用性和可读性,并尽量保持代码的简洁和清晰。

最后就是混入的使用

引入混入(Mixin)的方式主要有两种,分别是单页面引入和全局混入。

  1. 单页面引入

    • 首先,创建一个包含混入对象的文件。通常,这个文件会定义一个混入对象,该对象可以包含数据、方法、生命周期钩子等组件选项。
    • 然后,在需要使用混入的组件中,通过import语句引入这个混入对象。
    • 最后,在组件的配置对象中,使用mixins选项注册这个混入对象。这样,混入对象中的选项就会被合并到组件的选项中。

上面介绍的方式就是单页面引入。

  1. 全局混入

    • 全局混入的方式与单页面引入类似,首先需要创建一个混入对象。
    • 不同的是,全局混入是在应用的入口文件(如main.js)中进行引入和注册的。
    • 使用Vue.mixin(mixin)方法来注册全局混入对象。这将影响到之后创建的每一个Vue实例,包括第三方组件。
    • 需要注意的是,全局混入应谨慎使用,因为它可能会影响应用的性能和可维护性。

 如果是全局引入,则需要再main.ts中进行引入【项目中的方式】,而不需要在页面中进行引入了,页面中直接使用。

//全局混入
import {mixin2} from './mixin'Vue.mixin(mixin2)

这两种方式各有优缺点,单页面引入更加灵活,可以根据需要选择性地引入混入;而全局混入则可以在整个应用中统一添加某些功能或行为,但也可能带来一些不必要的副作用。因此,在使用混入时,应根据具体需求和使用场景来选择合适的方式。

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

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

相关文章

粉体包覆机、粉体干燥机、球磨机、整形机

包覆改性机在粉体加工中的应用和重要性主要体现在以下几个方面&#xff1a; 1.行业范围广泛&#xff1a;制药&#xff1a;用于药物载体、药物添加剂的生产&#xff0c;通过表面改性改善药物的释放性能、稳定性和生物相容性等&#xff1b;化妆品&#xff1a;用于口红、粉底、眼…

(三)行为模式:11、模板模式(Template Pattern)(C++示例)

目录 1、模板模式含义 2、模板模式的UML图学习 3、模板模式的应用场景 4、模板模式的优缺点 5、C实现的实例 1、模板模式含义 模板模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将某些步骤…

快速学习:Linux中传输文件夹的10个scp命令

本文详细介绍了10种利用scp命令在Linux系统中进行文件传输的方法&#xff0c;涵盖基础文件传输、使用密钥认证、复制整个目录、从远程主机复制文件、同时传输多个文件和目录、保持文件权限、跨多台远程主机传输、指定端口及显示传输进度等场景&#xff0c;旨在帮助用户在不同情…

设计模式(五)原型模式详解

设计模式&#xff08;五&#xff09;原型模式详解 原型模型简介 定义&#xff1a;原型模型是一种创建型设计模型&#xff0c;它允许通过克隆/复制现有对象来创建新的对象&#xff0c;而无需通过常规的构造函数进行实例化。 这种方式的主要优势是在运行时不需要知道具体的类&a…

【C++单调栈】962. 最大宽度坡|1607

本文涉及的基础知识点 C单调栈 LeetCode962. 最大宽度坡 给定一个整数数组 A&#xff0c;坡是元组 (i, j)&#xff0c;其中 i < j 且 A[i] < A[j]。这样的坡的宽度为 j - i。 找出 A 中的坡的最大宽度&#xff0c;如果不存在&#xff0c;返回 0 。 示例 1&#xff1a;…

免费的GB28181设备端EasyGBD,支持国标GB28181-2016和国标GB28181-2022,支持各种ARM系统、国产芯片、信创芯片

现在市面上还有很多卖国标GB28181设备端SDK的&#xff0c;EasyGBD免费的&#xff0c;基于C/C开发的国标GB28181设备库。 技术规格 编程语言&#xff1a;C/C&#xff0c;能适配任何平台&#xff0c;包括但不限于Windows、Linux、Android、ARM视频编解码器&#xff1a;H264、H26…

MPL助力固态前驱体光刻胶,图案化金属氧化物半导体更精密

大家好&#xff01;今天来了解一项金属氧化物增材制造研究——《Ultra-high precision nano additive manufacturing of metal oxide semiconductors via multi-photon lithography》发表于《nature communications》。在现代电子信息领域&#xff0c;金属氧化物半导体至关重要…

【031】基于SpringBoot+Vue实现的在线考试系统

文章目录 系统说明技术选型成果展示账号地址及其他说明源码获取 系统说明 基于SpringBootVue实现的在线考试系统是为高校打造的一款在线考试平台。 系统功能说明 1、系统共有管理员、老师、学生三个角色&#xff0c;管理员拥有系统最高权限。 2、老师拥有考试管理、题库管理…

mpu6050 设置低功耗模式

mpu6050 电源管理寄存器&#xff0c;参考博客&#xff1a;MPU6050学习笔记&#xff08;电源管理器1、2&#xff09; - LivingTowardTheSun - 博客园 (cnblogs.com) 根据手册&#xff0c;设置对应的寄存器即可&#xff1b; 具体代码&#xff1a; #define MPU_PWR_MGMT1_REG …

111.SAP ABAP - Function ALV - 列、行、单元格颜色 - 记录

目录 1.介绍 2.列背景色 3.行背景色 4.单元格背景色 4.1颜色码相关的结构 LVC_T_SCOL LVC_S_SCOL LVC_S_COLO 4.2单元格颜色设置方法 5.ALV 颜色码 1.介绍 在数据展示方面&#xff0c;要求ALV的数据列、行、单元格通过颜色醒目显示&#xff08;颜色展示…

【01】ZooKeeper特性与节点数据类型

1、Zookeeper介绍 ZooKeeper是一个开源的分布式协调框架&#xff0c;是Apache Hadoop 的一个子项目&#xff0c;主要用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来&#xff0c;构成一个高效可靠的原语集&…

掌控板micropython编程实现OLED中显示汉字

掌控板micropython编程实现OLED中显示汉字 1. 介绍 在ESP32中显示中文有很多种办法&#xff0c;例如&#xff0c;使用支持汉字的固件&#xff08;https://blog.csdn.net/weixin_42227421/article/details/134632037&#xff09;&#xff1b;使用PCtoLCD2002软件生成自定义字体…

apache poi导出excel

简介 常见的使用场景 入门 导入maven依赖 <!-- poi --> <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId> </dependency> <dependency><groupId>org.apache.poi</groupId><arti…

机器视觉:9点标定的原理与实现

一、什么是标定 标定就是将机器视觉处理得到的像素坐标转换成实际项目中使用到的毫米坐标。简单说即使看看实际单位距离内有几个像素&#xff0c;如下图所示&#xff0c;10mm的距离内有222个像素&#xff0c;那像素坐标和实际的毫米坐标就有个比例关系了。 二、九点标定 9点标…

【万能软件篇】03-Batchplot_setup_3.5.6(CAD批量打印插件)

批量打印插件&#xff08;Batchplot&#xff09;简介 Batchplot是一个专门针对AutoCAD2000以上版本设计的单DWG多图纸的批量生成布局、批量打印、批量分图工具。自行判定的图框位置与尺寸&#xff0c;根据当前的打印机设置&#xff0c;自动调整打印的方式&#xff0c;实现批量生…

2024 AFS-46 电子数据存在性鉴定(移动终端)(2024能力验证)

一、委托事项 1.给出检材手机的MEID。 2.给出检材手机在2024年7月3日上午连接过的设备名称。 3.给出检材手机中kimi应用最近一次被中断回答的问题内容。 4.给出检材手机中安装过的即时通讯应用的包名&#xff08;不包含虚拟机中的应用&#xff09;。 5.检材手机中安装有几…

C#与C++交互开发系列(十一):委托和函数指针传递

前言 在C#与C的互操作中&#xff0c;委托&#xff08;delegate&#xff09;和函数指针的传递是一个复杂但非常强大的功能。这可以实现从C回调C#方法&#xff0c;或者在C#中调用C函数指针的能力。无论是跨语言调用回调函数&#xff0c;还是在多线程、异步任务中使用委托&#x…

《数字图像处理基础》学习03-图像的采样

在之前的学习中我已经知道了图像的分类&#xff1a;物理图像和虚拟图像。《数字图像处理基础》学习01-数字图像处理的相关基础知识_图像处理 数字-CSDN博客 目录 一&#xff0c;连续图像和离散图像的概念 二&#xff0c;图像的采样 1&#xff0c; 不同采样频率采样同一张图…

Linux系统基础-多线程超详细讲解(1)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 Linux系统基础-多线程超详细讲解(1) 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

QGIS提取面的顶点坐标到属性表

相关参考&#xff1a;QGIS中提取面的中心坐标到属性表-CSDN博客 polygon_layer QgsProject.instance().mapLayersByName("Polygon")[0]polygon_layer.startEditing() polygon_layer.dataProvider().addAttributes([QgsField("coors", QVariant.String, le…