Vue 中 mixins(混入)的介绍和使用

目录

前言

什么是 mixins?

如何创建 mixins?

如何使用 mixins

mixins 的特点

方法和参数在各组件中不共享

mixins 与组件冲突

冲突之 合并+覆盖

冲突之 合并

全局 mixins

mixins 中有异步请求的情况

与 vuex 的区别

与公共组件的区别


前言

在项目开发的时候,常会碰到这样的一种现象:有两个组件非常相似,比如较为熟悉的 Modal 、 Tooltip 和 Popover ,它们都具有同样的基本函数,而且它们之间也有足够的不同。很多时候,就让人很难做出选择:是把它们拆会成多个不同的组件呢?还是只使用一个组件,创建足够的属性来改变不同的情况?

这些解决方案都不够完美。如果拆分成多个组件,就不得不冒着如果功能变动你要在多个文件中更新它的风险。另一方面,太多的属性会很快变得混乱,难维护,甚至对于组件开发者自已面言,也是件难事。

在Vue中,对于这样的场景,官方提供了一种叫混入 (mixins) 的特性。可以利用 mixins 将公共部分提取出来,使用 mixins 允许你封装一块在应用的其他组件中都可以使用的函数。如果被正确的使用,他们不会改变函数作用域外部的任何东西,所以多次执行,只要是同样的输入,总是能得到一样的值。

什么是 mixins?

混入 (mixins) 是一个 JavaScript 对象,可以包含任意组件选项,比如 Vue 实例中生命周期的各个钩子函数,也可以是 data 、components 、methods 或 directives 等。当组件使用混入对象时,所有混入对象的选项将被混合进入该组件本身的选项。

如何创建 mixins?

在 src 目录下创建一个 mixins 文件夹,在文件夹下新建一个 myMixins.js 文件。因为 mixins 是一个 js 对象,所以应该以对象的形式来定义 myMixins,在对象中可以和 vue 组件一样来定义 data、components、methods、created、computed 等属性,并通过 export 导出该对象。

如何使用 mixins

在需要调用的组件中引入 myMixins.js 文件,然后在 export default 中引入需要的对象即可。

<script>
import { myMixins } from "@/mixins/myMixins.js"
export default {mixins: [myMixins]
}
</script>

mixins 的特点

方法和参数在各组件中不共享

虽然组件调用了 mixins 并将其属性合并到自身组件中来了,但是其属性只会被当前组件所识别并不会共享,也就是其他组件无法从当前组件中获取到 mixins 中的数据和方法。

① 首先在 myMixins.js 中定义一个 age 字段和 getAge 方法

export const myMixins = {components:{},data() {return {age: 18,}},mounted() {this.getAge()},methods: {getAge() {console.log(this.age)}}
}

② 组件1中对 num 进行 +1 操作

import { myMixins } from "@/mixins/myMixins.js";
export default {mixins: [myMixins],data() {return {}},created() {this.age++},
}

③ 组件2不进行操作

export default {mixins: [myMixins],data() {return {}},
}

④ 我们分别切换到两个页面,查看控制台输出。

会发现组件1改变了 age 里面的值,组件2中 age 值还是混合对象的初始值,并没有随着组件1的增加而改变

mixins 与组件冲突
冲突之 合并+覆盖
  • 数据对象(data)在内部会进行递归合并
  • 值为对象(components、methods 、computed、directives)的选项将被合并为同一个对象。
  • 键冲突时优先组件即组件中的键会覆盖混入对象。

① 在混入对象增加 age 属性、getAge1 方法和 getAge2 方法

// myMixins.js
export const myMixins = {components:{},data() {return {age: 18,}},methods: {getAge1() {console.log("age1 from mixins =", this.age )},getAge2() {console.log("age2 from mixins =", this.age )},}
}

② 我们在引入了 myMixins 文件的组件中,增加 age 属性、getAge1 方法和 getAge3 方法

// template.vue
import { myMixins } from "@/mixins/myMixins.js";
export default {mixins: [myMixins],data() {return {age: 20,}},mounted() {this.getAge1();this.getAge2();this.getAge3();},methods: {getAge1() {console.log('age1 from template =', this.age)},getAge3() {console.log('age3 from template =', this.age)},}
}

③ 我们会发现,组件中的 age 覆盖了混合对象的 age,组件的 getAge1 方法覆盖了混合对象的 getAge1 方法

冲突之 合并

watch选项、钩子函数混入组件时,选项会被合并到一个数组中,因此都会被执行。按照传入顺序依次调用,并在调用组件自身的钩子之前被调用。

// myMixins.js
export const myMixins = {components:{},data() {return {}},created() {console.log('xxx from mixins')}
}
import { myMixins } from "@/mixins/myMixins.js";
export default {mixins: [myMixins],data() {return {}},created() {console.log('xxx from template')}
}

全局 mixins

当我们使用全局混合时,我们不是指能够在每个组件上访问它们,就像是过滤器一样。我们能够通过  mixins:[myMixins]  访问组件上的混合对象。

全局混合被注册到了每个单一组件上。因此,它们的使用场景极其有限并且要非常的小心。一个我能想到的用途就是它像一个插件,你需要赋予它访问所有东西的权限。但即使在这种情况下,我也对你正在做的保持警惕,尤其是你在应用中扩展的函数,可能对你来说是不可知的

为了创建一个全局实例,我们可以把它放在 Vue 实例之上。在一个典型的 Vue-cli 初始化的项目中,它可能在你的  main.js  文件中。

Vue.mixin({mounted() {console.log('hello from mixin!')}
})new Vue({...
})

谨慎使用全局混入对象,因为会影响到每个单独创建的 Vue 实例 (包括第三方模板)。大多数情况下,只应当应用于自定义选项,就像上面示例一样。也可以将其用作 插件 以避免产生重复应用。

mixins 中有异步请求的情况

问题描述: 当混合里面包含异步请求函数,而我们又需要在组件中使用异步请求函数的返回值时,我们会取不到此返回值。如下:

// myMixins.js
export const myMixins = {components:{},data() {return {num: 1,}},methods: {getDate1() {new Promise((resolve,reject) => {let a = 1;setTimeout(() => {resolve(a)},500)}).then(res => {console.log(res,'res');return res})},}
}
// todo.vue
import { myMixins } from "./myMixins.js";export default {mixins: [myMixins],data() {return {}},mounted() {console.log(this.getDate1,'template1-func_one')}
}

打印结果:undefined "template1-func_one"

解决方案:不要返回结果,而是直接返回异步函数

// myMixins.js
export const myMixins = {components:{},data() {return {num: 1,}},methods: {async getDate1() {let result = await new Promise((resolve,reject) => {let a = 1;setTimeout(() => {resolve(1)},500)})return result},}
}
// todo.vue
import { myMixins } from "./myMixins.js";export default {mixins: [myMixins],data() {return {}},mounted() {this.getDate1().then(res => {console.log(res,'template1-res')})}
}

打印结果:1 "template1-res"

与 vuex 的区别

  • vuex: 用来做状态管理的,里面定义的变量在每个组件中均可以使用和修改,在任一组件中修改此变量的值之后,其他组件中此变量的值也会随之修改。
  • Mixins: 可以定义共用的变量,在每个组件中使用,引用组件中之后,各个变量是相互独立的,值的修改在组件中不会相互影响。

与公共组件的区别

  • 组件: 在父组件中引入组件,相当于在父组件中给出一片独立的空间供子组件使用,然后根据 prop 来传值,但本质上两者是相对独立的。
  • Mixins: 在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件。

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

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

相关文章

论文笔记:Time-LLM: Time Series Forecasting by Reprogramming Large Language Models

iclr 2024 reviewer 评分 3888 1 方法 提出了 Time-LLM&#xff0c; 是一个通用的大模型重编程&#xff08;LLM Reprogramming&#xff09;框架将 LLM 轻松用于一般时间序列预测&#xff0c;而无需对大语言模型本身做任何训练 为什么需要时序数据和文本数据对齐&#xff1a;时…

个人电脑信息安全注意事项

个人电脑信息安全注意事项 一、密码安全&#xff1a; 设置复杂且独特的密码&#xff0c;避免使用容易猜测或常见的密码。 定期更换密码&#xff0c;特别是在重要账户或应用上。 不要在多个账户上重复使用相同的密码。 使用密码管理工具来安全地存储和访问密码。 二、软件安…

ElasticSearch中使用向量和关键词联合检索

注&#xff1a;案例测试数据及其索引构建详见&#xff1a;ElasticSearch中使用bge-large-zh-v1.5进行向量检索&#xff08;一&#xff09;-CSDN博客 中的第三部分。 假设任务场景为&#xff1a;用“新疆”向量检索相关的数据&#xff0c;同时需要匹配关键词“巴州”。 首先获取…

前端表单input的简单使用

1.代码结构介绍 2.实战效果

DASCTF X GFCTF 2024|四月开启第一局 —— re前三题wp

四月安恒月赛 prese 平坦化混淆 经过输入测试和代码分析可发现&#xff0c;核心加密是这一句的逻辑&#xff0c;这一句会根据输入的长度生成temp数组 尝试得到输入与输出的映射关系后解&#xff1a; cipher [0x86, 0x83, 0x91, 0x81, 0x96, 0x84, 0xB9, 0xA5, 0xAD, 0xAD…

【机器学习】《ChatGPT速通手册》笔记

文章目录 第0章 前言第1章 ChatGPT的由来&#xff08;一&#xff09;自然语言处理任务&#xff08;二&#xff09;ChatGPT所用数据数据大小&#xff08;三&#xff09;ChatGPT的神经网络模型有175亿个参数&#xff08;四&#xff09;模型压缩 方案 第2章 ChatGPT页面功能介绍&a…

RabbitMQ学习记录

核心概念 Brocker&#xff1a;消息队列服务器实体 Exchange(消息交换机)&#xff1a;它指定消息按什么规则&#xff0c;路由到哪个队列。 Queue(消息队列载体)&#xff1a;每个消息都会被投入到一个或多个队列。 Binding(绑定)&#xff1a;它的作用就是把exchange和queue按…

RF高频腔设计(4)

3.5 pillbox Cavity 从之前的知识我们可以知道&#xff0c;在空心的波导中&#xff0c;电磁场的模式是“离散”的&#xff0c;只有特定模式能够传播&#xff0c;并且与波导的几何形状和尺寸相关。 在RF高频腔设计&#xff08;2&#xff09;中&#xff0c;从传播常数k的图中可…

[Kubernetes] etcd的集群基石作用

文章目录 1. 配置存储2. 数据一致性3. 服务发现与协调4. 集群状态中枢5. 集群稳定性 1. 配置存储 etcd作为一个高度可靠的分布式键值存储系统&#xff0c;存储了Kubernetes集群的完整配置和状态数据。集群的元数据&#xff0c;包括节点信息、命名空间、部署、副本集、服务、持…

Linux_进程

目录 1、冯诺依曼体系 2、Linux下的进程概念 3、PCB结构体 4、在Linux下查看进程 5、父子进程 6、终止进程 7、操作系统的进程状态 7.1 Linux下的进程状态 8、孤儿进程 9、进程优先级 9.1 PRI和NI 结语 前言&#xff1a; 进程作为操作系统中最核心的知识点之…

应急局rfid资产管理系统建设方案

应急局RFID资产管理系统的建设方案涉及以下几个方面&#xff1a; 1.需求分析&#xff1a;通过与应急局相关部门沟通&#xff0c;了解其对资产管理系统的需求&#xff0c;包括对资产的实时监控、定位追踪、盘点和管理等功能的要求。 2.系统设计&#xff1a;根据需求分析&#xf…

Linux下:gcc/g++调试工具gdb

gdb 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 gdb mybin debug和release debug debug模式下生成的可执行程序会添加调试信息&#xff0c;所以生成的可执行程序会较大 在使用gcc/g进行编译的时…