Vue mixin 混入

可以复用的组件,我们一般会抽离,写成公共的模块。

可以复用的方法,我们一般会抽离,写成公共的函数。

那么 在 Vue 中,如果 某几个组件实例 VueComponent 中或者 整个 Vue 项目中 都存在相同的配置,那就需要用到 mixin 这个方法了

混入 (mixin) :提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。

 首先、我们需要明白第一点,mixin 是一个对象,而且是包含组件中任意配置项的对象,也就是说,创建组件的时候,我们传递的 data、component、methods、computed、directives、生命周期钩子函数 等等 一系列配置项 都可以作为 mixin 对象的键值对。

其次、我们创建的 mixin 对象,在组件中引用的时候,mixin 对象 中的键值对会 混入 该组件的配置详项中,至于是怎么混入的,下面在讲。 

创建 mixin 

 这个 mixin 对象 中,配置了一个 created 钩子函数,和 methods 对象,如果我们单独把这个配置写在组件中的话,那就是组件在初始化的时候,就会调用 hello() 

// 定义一个混入对象
var myMixin = {created: function () {this.hello()},methods: {hello: function () {console.log('hello from mixin!')}}
}

创建一个 mixin 混入对象是很简单的,只是我们需要注意的是,配置的键值对,只能是创建组件时传入的配置项,如果,你传了一个 其他不存在的属性 ,组件接收之后,是不会对其解析的,就相当于你在组件内部,定义了一个不存在属性,Vue 底层是不会管这个玩意的。

export const mixin = {msg: {success: "1",},
};export default {name: 'HelloWorld',msg: {success: "1",}
}

使用 mixin 混入 

创建了一个 mixin 对象之后,组件需要使用的时候,就和引入公共组件和公共方法一样。至于其中的内容,还是使用上面定义的

比如:我在 src 目录下新建了一个 mixin 文件夹,和一个 index.js 文件,那我在引用的时候就正常引入,至于 你是 默认暴露还是分别暴露,那就看个人习惯了。

import {mixin} from '@/mixin/index'

然后在组件配置项中,配置一个 mixins 属性,值是一个数组。

export default {name: 'HelloWorld',mixins:[mixin]
}

刷新页面,你会发现控制台上已经输出了 我想要的结果

 mixin 选项合并

 因为 mixin 混入对象 中的配置,是包含组件中任意配置项的对象,如果我的 mixin 混入对象中定义的配置,和组件内部定义的配置出现了同名了,那 Vue 是怎么合并这两个选项的呢?

data数据对象:在内部会进行递归合并,并在发生冲突时以组件数据优先

var mixin = {data: function () {return {message: 'hello',foo: 'abc'}}
}new Vue({mixins: [mixin],data: function () {return {message: 'goodbye',bar: 'def'}},created: function () {console.log(this.$data)// => { message: "goodbye", foo: "abc", bar: "def" }}
})

同名钩子函数 将合并为一个数组,因此都将被调用。另外,混入对象的钩子将在组件自身钩子 之前 调用。

export const mixin = {created: () => {console.log("mixin混入对象的钩子被调用!");},
};export default {name: 'HelloWorld',mixins: [mixin],created: function () {console.log('组件钩子被调用')}
}

 值为对象的选项例如 methodscomponents 和 directives,将被合并为同一个对象。两个对象键名冲突时,取组件对象的键值对。

export const mixin = {created: () => {console.log("mixin混入对象的钩子被调用!");},methods: {foo: () => {console.log("foo");},conflicting: () => {console.log("from mixin");},},
};export default {name: "HelloWorld",mixins: [mixin],created: () => {console.log("组件钩子被调用");},methods: {bar: () => {console.log("bar");},conflicting: () => {console.log("from self");},},
};

在组件中调用这三个方法,看看在控制台上输出的是啥

<div @click="bar">bar</div>
<div @click="conflicting">conflicting</div>
<div @click="foo">foo</div>

 可以看到,mixin 混入对象中存在的 foo 函数,和 conflicting函数,而组件中 存在 bar函数 和 conflicting 函数。在组件中能成功调用这三个方法,说明 mixin 混入对象中的 foo 函数,已经被合并到了组件的 methods 对象中。而 conflicting 函数执行之后,根据打印出的值,发现该函数执行的是 组件内部定义的 conflicting 函数。这就说明两个对象键名冲突时,取组件对象的键值对。

全局混入

上面讲的都是在组件内部混入,其实也可以在全局中混入。在 mian.js 中,当 执行 new Vue ( ) 之前,可以通过 Vue.mixin() 函数,向其内部传入一个 mixin 混入对象,Vue 底层就会将混入对象挂载到Vue全局上。

Vue.mixin({created:  () => {console.log('我在全局混入了created钩子函数');},
});new Vue({render: h => h(App),
}).$mount('#app')

但是这样存在一个问题,就是如果我在全局通过 Vue.mixin() 混入了配置,那么我所有的组件 (包括第三方组件) 都会混入这个配置,这样可能会导致组件配置混乱冗余,甚至覆盖第三方组件的配置导致程序出错。

 上面我在全局混入了 一个 钩子函数,导致这个钩子函数执行了三次,这是因为,在 new Vue() 的时候执行了一次,App组件中执行了一次,在 HelloWorld 组件也执行了一次。这就看出来很多余了。

 自定义混入

区别:通过 Vue.mixin() 混入的是正常混入,直接写在 new Vue() 中(或者是组件中)的是自定义混入。通过Vue.config.optionMergeStrategies 添加的也是自定义混入

Vue.mixin({created: function () {var myOption = this.$options.myOptionif (myOption) {console.log(myOption)}}
})new Vue({myOption: 'hello!'
})

 这里只打印了一次,代表只在 new Vue()的时候执行了一次。大多数情况下,全局的混入只应当应用于自定义选项,这样可以避免上面的副作用。

自定义选项将使用默认策略,即简单地覆盖已有值。

我先正常混入了一个  myOption 属性,值为 123。

Vue.mixin({myOption:'123',
});

打印vm实例,$options 对象中存在该键值对

 直接在 new Vue() 中定义 同名属性,值为 abc

const vm =  new Vue({myOption:'abc',render: h => h(App),
}).$mount('#app')

打印 vm实例对象,发现属性值已经更改。

如果想让自定义选项以自定义逻辑合并,可以向 Vue.config.optionMergeStrategies 添加一个函数,那我们来看看 Vue.config.optionMergeStrategies 是个啥

打印出来一看, 好家伙,这不就是 Vue 实例上的所有方法么。按文档的意思,我好像也可以自定义的往这里面加我自己的方法。

var strategies = Vue.config.optionMergeStrategies;
strategies.myOption = "123";

 我随便往里面加了一个 myOption 属性,值为 123,打印出来之后,确实存在设置的属性和值

我默认在 new Vue()的时候,注入了一个自定义的选项。这个时候,我们打印这个接收到的vm实例对象,能在 $options 里面找到该属性,且它的值就是我设置的 hello

 通过  Vue.config.optionMergeStrategies 添加一个同名的属性 ,但是这个属性值是一个函数,且没有返回值。然后打印vm实例对象会发现 $options 里面的 myOption 属性值 变成了undefined,函数没有返回值,那肯定是undefined。

 增加一个 返回值 abc,再来看看。

上面的例子只是做一个演示,表示这个 也可以 通过  Vue.config.optionMergeStrategies 来覆盖之前的 自定义 选项,同时还可以让自定义选项以自定义逻辑合并

Vue.config.optionMergeStrategies.myOption = function (toVal, fromVal) {// 接收两个参数,返回合并后的值,toVal - 现在定义的值,fromVal - 之前定义的值console.log(toVal, fromVal, "toVal, fromVal");return "aaaaaaa";
};

Vue.config.optionMergeStrategies 对象

 Vue.config.optionMergeStrategies 对象 中存在的属性之前说过了,就是 实例对象上的属性和方法。那这么多方法 在合并的时候都是怎么合并的呢?这个就需要去源码里面瞅一瞅了。

总结

总结:

1、mixin 混入是一个对象,对象的配置项就是 创建组件 时传入的 options 配置项

2、在组件内混入时,增加引入 mixin 对象,配置项中新增 mixins:['xxx']。全局混入时 Vue.mixin()

3、正常混入( 在组件中新增配置项 或在全局中使用 Vue.mixin()  ) 和  自定义混入的方式( new Vue() 中增加自定义项 或使用 Vue.config.optionMergeStrategies )还是存在区别的

4、混入的规则

  • 普通的js原始值(string,number,boolean等)直接覆盖,以组件值为主。
  • 对象的合并,如果合并双方都是对象,则使用递归的方式将其合并,以组件对象为主。
  • 对于函数,如果需要他们合并后都可以执行,则可以考虑将函数合并成数组,然后你可以将其包装成一个新函数,依次调用合并后数组中的函数。生命周期钩子函数就是这样,最后是先执行混入的钩子,在执行自己的钩子。
  • 如果合并的是一些特殊对象,不能递归合并,那么根据情况,你还可以使用原型链的方式进行合并。

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

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

相关文章

firefox笔记-Centos7离线安装firefox

目前&#xff08;2023-03-22 16:41:35&#xff09;Centos7自带的firefox已经很新了是2020年的。主要原因是有个web项目&#xff0c;用2020年的firefox打不开。 发到互联网上是2023-07-24。 报错是js有问题&#xff0c;估计是搞前端的只做了chrome适应&#xff0c;没做firefox…

Spring使用注解进行对象装配(DI)

文章目录 一. 什么是对象装配二. 三种注入方式1. 属性注入2. 构造方法注入3. Setter注入 三. 三种注入方式的优缺点四. 综合练习 通过五大类注解可以更便捷的将对象存储到 Spring 中&#xff0c;同样也可以使用注解将已经储存的对象取出来&#xff0c;直接赋值到注解所在类的一…

ATTO488 NHS ester ,新型亲水性荧光标记物,具有良好的水溶性

陕西新研博美生物科技有限公司MISS.wu小编&#xff08;2023.7月26日&#xff09;为大家整理以下的内容&#xff1a; Atto488-NHS是一种新型亲水性荧光标记物&#xff0c;具有良好的水溶性。这种染料表现得很浓吸收、高荧光量子产率以及优异的热稳定性和光稳定性。因此&#xff…

亚马逊、速卖通,阿里国际等平台测评如何用自养号测评补单

在电商领域&#xff0c;补单是一种常见的推广方式。它能够优化商品销售、留下优质评论、打压竞品和赶走跟卖等&#xff0c;具有很多好处。然而&#xff0c;补单也存在安全性问题&#xff0c;有些卖家找人补单后店铺反而出了问题。因此&#xff0c;了解测评系统是非常重要的的。…

android9-android13 AMS演进初窥

目录 一&#xff1a;概览 WindowManagerService 基本介绍 ActivityManagerService 基本介绍 二&#xff1a;AMS及其关联的WMS中主要组件的类图和对像图 一&#xff1a;android 9中AMS/WMS的类图和对像图 二&#xff1a;android 10中AMS/WMS的类图和对像图 三&#xff1a…

关于应用在Google Play的元数据优化

应用标题中的关键词权重最大&#xff0c;其次是简短描述中的关键词&#xff0c;最后是长描述关键词&#xff0c;了解这些就能够很好的提高应用的可见度&#xff0c;下载量和整体成功率。 1&#xff0c;标题。 Google Play最多允许标题容纳30个字符&#xff0c;关键词的频率和密…

盘点!项目管理软件排行榜前十名

如今企业规模不断扩大&#xff0c;业务逐渐复杂化&#xff0c;项目管理已经成为现代企业管理中不可或缺的一环。作为协调管理者、团队成员和客户之间交流的工具&#xff0c;项目管理软件不仅可以提高工作效率&#xff0c;还可以提高项目成功的几率&#xff0c;对于企业具有重要…

Unity进阶--对象池数据场景管理器笔记

文章目录 泛型单例类泛型单例类&#xff08;不带组件版&#xff09;对象池管理器数据管理器场景管理器 泛型单例类 using System.Collections; using System.Collections.Generic;public abstract class ManagersSingle<T> where T : new() {private static T instance;…

DevExpress WPF Tree List组件,让数据可视化程度更高!(一)

DevExpress WPF Tree List组件是一个功能齐全、数据感知的TreeView-ListView混合体&#xff0c;可以把数据信息显示为REE、GRID或两者的组合&#xff0c;在数据绑定或非绑定模式下&#xff0c;具有完整的数据编辑支持。 DevExpress WPF 拥有120个控件和库&#xff0c;将帮助您…

验证码登录如何实现?

手机验证码登录 1、需求分析2、数据模型3、代码开发-交互过程4、代码开发-准备工作5、代码开发-修改LoginCheckFilter6、代码开发-接口开发7、前端代码介绍8、启动测试 1、需求分析 为了方便用户登录&#xff0c;移动端通常都会提供通过手机验证码登录的功能。 手机验证码登录…

手边酒店多商户版小程序V1.0.47 全开源版 安装测试教程

手边酒店多商户小程序是基于框架应用模块应用&#xff0c;需要框架基础上使用&#xff0c;总体体验了一下功能还是强大&#xff0c;非常合适酒店及民宿类小程序搭建。小程序端支持多店版支持平台入驻。手边酒店多商户版只有模块版&#xff0c;无独立版本&#xff0c;该版本核心…

Rust vs Go:常用语法对比(十)

题图来自 Rust vs. Golang: Which One is Better?[1] 182. Quine program Output the source of the program. 输出程序的源代码 package mainimport "fmt"func main() { fmt.Printf("%s%c%s%c\n", s, 0x60, s, 0x60)}var s package mainimport "fm…

桥梁安全生命周期监测解决方案

一、方案背景 建筑安全是人们生产、经营、居住等经济生活和人身安全的基本保证&#xff0c;目前我国越来越多的建筑物逐 步接近或者已经达到了使用年限&#xff0c;使得建筑物不断出现各种安全隐患&#xff0c;对居民的人身安全和财产安全产 生不利影响&#xff0c;因此房…

Bug竞技场【已经修复】

目录 1.基础知识 2.最佳组合 2.1 铁男-螳螂 2.2 弟弟组合 海克斯抽卡bug 1.基础知识 背景&#xff1a;美测服-美服-马服-可以有效地减少bug率 复盘是为了更好的战斗&#xff01; 提前观看一些视频资料也是如此。 通过看直播博主的经验&#xff0c;可以让你关注到本来对战的…

Python 生成随机图片验证码

使用Python生成图片验证码 Python 生成随机图片验证码安装pillow包pillow包生成图片基本用法生成图片验证码 Python 生成随机图片验证码 在写一个Web项目的时候一般要写登录操作&#xff0c;而为了安全起见&#xff0c;现在的登录功能都会加上输入图片验证码这一功能&#xff…

结构型设计模式之组合模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

Hadoop学习日记-MapReduce思想及执行流程

MapReduce思想 Map负责“拆分”&#xff1a;即将复杂问题拆分成可以并行计算的小问题&#xff0c;彼此之间几乎没有依赖联系。 Reduce负责对Map阶段的结果进行合并汇总 Map和Reduce的抽象接口如下&#xff1a; map:(k1; v1) — (k2; v2) reduce:(k2; [v2]) — (k3; v3) 一…

看了2023年的一线互联网公司时薪排行榜!值得思考

前言 根据最近针对国内的一线互联网企业做的调研&#xff0c;汇总了他们的平均时薪水平&#xff0c;最终出了一个排行榜&#xff01; 首先我们来看下&#xff0c;排行榜分哪几个Level&#xff0c;分别为初级、中级、高级、资深、专家/架构这五个&#xff0c;主要根据工程师的…

基于Javaweb实现ATM机系统开发实战(十四)交易记录分页实现

还是老规矩&#xff0c;先看前端页面查看需要传递哪些参数&#xff0c;并且把逻辑有问题的部分进行修改~ <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <% taglib prefix"c" uri&qu…

自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配,用于找到与查询语句最相似的文本

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理14-基于文本向量和欧氏距离相似度的文本匹配&#xff0c;用于找到与查询语句最相似的文本。NLP中的文本匹配是指通过计算文本之间的相似度来找到与查询语句最相似的文本。其中一种常用的方法是基于文本…