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)

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Python大数据的招聘数据分析及大屏可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

2024软考-《软件设计师》-易混淆知识点总结(1~6章)

一、计算机组成与体系结构 1.1、原码、反码、补码、移码的运算 原码&#xff1a;最高位表示符号位&#xff0c;其余低位表示数值的绝对值&#xff08;0表示正数&#xff0c;1表示负数&#xff09; 反码&#xff1a;正数的反码与原码相同&#xff0c;负数的反码是其绝对值按位…

基于ESP32的RGB便携式视频灯

基于ESP32的RGB便携式视频灯 拥有一套能够满足个人需求的灯光设备至关重要。市面上的RGB视频灯虽然功能强大&#xff0c;但往往价格不菲。我制作的这款灯是20W RGB便携式视频灯不仅满足了我的需求&#xff0c;而且成本仅为市售产品的三分之一。接下来&#xff0c;我将详细介绍这…

大模型开发实战1-QuickStart

0. 关于大模型和模型选择 由于OpenAI的ChatGPT流行&#xff0c;AI技术在大模型技术的赋能下高速发展&#xff0c;特别是2023年至今&#xff0c;国内的AI技术发展更是前所未有的景象&#xff0c;各大公司争相发布自己的大模型&#xff0c;包括百度文心一言&#xff0c;阿里同义…

正版CST电磁仿真软件:保障创新与合规的基石

在当今快速发展的科技时代&#xff0c;电磁仿真技术对于电子产品的设计、测试和优化至关重要。CST电磁仿真软件以其强大的功能和广泛的应用领域&#xff0c;成为众多企业和研究机构不可或缺的工具。然而&#xff0c;在选择使用CST软件时&#xff0c;确保使用正版软件不仅是对知…

【C++】红黑树的底层原理以及实现

#1024程序员节 | 征文# 个人主页&#xff1a;夜晚中的人海 文章目录 ⭐前言&#x1f686;一、红黑树的概念&#x1f3e0;二、红黑树的规则&#x1f384;三、红黑树的效率&#x1f3a1;四、红黑树的实现1. 基本框架2. 插入操作• 变色• 单旋 变色• 双旋 变色 3. 查找操作4. …

玄机平台-应急响应-webshell查杀

首先xshell连接 然后进入/var/www/html目录中&#xff0c;将文件变成压缩包 cd /var/www/html tar -czvf web.tar.gz ./* 开启一个http.server服务&#xff0c;将文件下载到本地 python3 -m http.server 放在D盾中检测 基本可以确认木马文件就是这四个 /var/www/html/shell.p…

高效实现聚水潭数据集成MySQL的技术案例

聚水潭奇门数据集成到MySQL的技术案例分享 在现代企业的数据管理中&#xff0c;如何高效、准确地实现不同系统之间的数据对接是一个关键问题。本文将聚焦于一个实际的系统对接集成案例&#xff1a;将聚水潭奇门平台的售后单数据集成到MySQL数据库中&#xff0c;具体方案名称为…

JVM—类的生命周期

目录 类的生命周期 加载阶段 连接阶段 验证阶段 准备阶段 解析阶段 初始化阶段 面试题1 面试题2 类的生命周期 类的生命周期描述了一个类加载、使用、卸载的整个过程&#xff0c;整体可以分为以下五个阶段。 1. 加载 2. 连接&#xff0c;其中又分为验证、准备、解析三…

Python学习的自我理解和想法(21)

学的是b站的课程&#xff08;千锋教育&#xff09;&#xff0c;跟老师写程序&#xff0c;不是自创的代码&#xff01; 今天是学Python的第21天&#xff0c;学的内容是文件的操作。开学了&#xff0c;时间不多&#xff0c;写得不多&#xff0c;见谅。 目录 1.文件 (1).参数…

Tcp_Sever(线程池版本的 TCP 服务器)

Tcp_Sever&#xff08;线程池版本的 TCP 服务器&#xff09; 前言1. 功能介绍及展示1.1 服务端连接1.2 客户端连接&#xff08;可多个用户同时在线连接服务端&#xff09;1.3 功能服务1.3.1 defaultService&#xff08;默认服务&#xff09;1.3.2 transform&#xff08;大小写转…

Rust与Javascript的使用对比

一、常量 RustJavascriptletconst 二、变量 RustJavascriptlet mutlet / var 三、常用打印 RustJavascriptprintln!(“换行”);console.log(‘hello’);print!(“不换行”);console.info(‘信息’);-console.error(‘错误’);-console.warn(‘警告’); 四、定义字符串 R…

开放式耳机哪个品牌音质好?高评分爆款开放式耳机推荐!

一直活跃在蓝牙耳机圈子里的我&#xff0c;对各种类型的耳机多少都有自己的看法&#xff0c;完全可以说是个耳机狂热者。近几年&#xff0c;开放式蓝牙耳机愈发火爆。开放式耳机不是任何品牌都能轻松做好的产品&#xff0c;特别是音质&#xff0c;它涵盖了核心单元技术等诸多方…

负载均衡服务器攻击怎么解决最有效?

负载均衡服务器攻击怎么解决最有效&#xff1f;常见的有效解决方法包括&#xff1a;使用SYNCookie机制、限制ICMP包速率、基于源IP的连接速率限制、检测并丢弃异常IP包、配置访问控制列表&#xff08;ACL&#xff09;、设置虚拟服务器/服务器连接数量限制、设置HTTP并发请求限制…

ABAQUS应用11——支座弹簧

文章目录 0、背景1、ABAQUS中几类弹簧的简介2、SPRING1的性质初探 0、背景 1、ABAQUS中几类弹簧的简介 先说参考来源&#xff0c;ABAQUS2016的帮助文档里第4卷&#xff0c;32.1.1节&#xff0c;有三种弹簧&#xff08;SPRING1 、SPRING2 以及SPRINGA&#xff09;。 三种弹簧里…

C for Graphic:视差渲染(一)

记录一下最近优化场景的做法&#xff1a;视差渲染 原理&#xff1a;通过视口坐标的变化&#xff0c;观察不同采样画面的功能&#xff0c;画面的载体为低模平面 我早期工作&#xff0c;在小作坊全栈的时候&#xff0c;做过一段时间web开发&#xff0c;做了一个古董藏…

【传知代码】机器学习在情绪预测中的应用(论文复现)

在科技迅猛发展的今天&#xff0c;我们不仅在追求更强大的计算能力和更高的精度&#xff0c;还希望我们的机器能够理解和回应我们复杂的情感世界。设想一下&#xff0c;当你面对挫折时&#xff0c;设备不仅能识别你的情绪&#xff0c;还能以一种富有同情心和洞察力的方式作出反…

开放式耳机哪个牌子好?开放式蓝牙耳机排行榜分享

​耳机已经成为我们日常生活中的必需品&#xff0c;但长时间佩戴传统入耳式耳机可能会导致耳朵不适&#xff0c;甚至影响健康。为了应对这一挑战&#xff0c;开放式耳机应运而生。这类耳机不侵入耳道&#xff0c;有效减轻了耳朵的压力&#xff0c;同时减少了感染风险&#xff0…

fmql之Linux中I2C总线框架

正点原子第44章 I2C zynq I2C pcf8563芯片 我们用的是ds3231. Linux I2C总线框架 I2C总线驱动 这部分内容是半导体厂商编写的。 I2C总线设备 zynq I2C适配器驱动 I2C设备驱动编写 使用设备树 代码编写 设备树修改 设备驱动编写 因为用的是ds3231&#xff0c;所以先找…

使用 PyTorch 构建 LSTM 股票价格预测模型

目录 引言准备工作1. 训练模型&#xff08;train.py&#xff09;2. 模型定义&#xff08;model.py&#xff09;3. 测试模型和可视化&#xff08;test.py&#xff09;使用说明模型调整结论 引言 在金融领域&#xff0c;股票价格预测是一个重要且具有挑战性的任务。随着深度学习…