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

2023-11-16


当我们的项目越来越庞大,项目中的某些组件之间可能会存在一些相似的功能,这就导致了在各个组件中需要编写功能相同的代码段,重复地定义这些相同的属性和方法,导致代码地冗余,还不利于后期代码的维护。

一、什么是Mixins

mixins(混入),官方的描述是一种分发 Vue 组件中可复用功能的非常灵活的方式,mixins 是一个 js 对象,它可以包含我们组件中 script 项中的任意功能选项,如:data、components、methods、created、computed 等等。我们只要将公用的功能以对象的方式传入 mixins 选项中,当组件使用 mixins 对象时所有 mixins 对象的选项都将被混入该组件本身的选项中来,这样就可以提高代码的重用性,并易于后期的代码维护。

二、何时使用Mixins

当我们存在多个组件中的数据或者功能很相近时,我们就可以利用 mixins 将公共部分提取出来,通过 mixins 封装函数,组件调用他们是不会改变函数作用域外部的。

三、如何创建Mixins

在 src 目录下创建一个 mixins 文件夹,在文件夹下新建一个 myMixins,js 文件。因为 mixins 是一个 js 对象,所以应该以对象的形式来定义 myMixins,在对象中可以和 vue 组件一样来定义 data、components、methods、created、computed 等属性,并通过 export 导出该对象。
也可以在 views 文件夹某个页面文件下创建 mixins 文件夹。(一切视设实际情况而定)
在这里插入图片描述
在这里插入图片描述

四、如何使用Mixins

在需要调用的组件中引入 myMixins,js 文件,然后在 export default 中引入需要的对象即可。
在这里插入图片描述

五、Mixins的特点

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

虽然组件调用了 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的增加而改变
在这里插入图片描述

5.2 Mixins 合并冲突

5.2.1 值为对象 合并冲突

值为对象(components、methods 、computed、data)的选项,混入组件时选项会被合并,键冲突时优先组件,组件中的键会覆盖混入对象的。

①我们在混入对象增加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方法
在这里插入图片描述

5.2.2 值为函数 合并冲突

值为函数(created、mounted)的选项,混入组件时选项会被合并调用,混合对象里的钩子函数在组件里的钩子函数之前调用。

// 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 中有异步请求的情况

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

// 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 文件中:

// todo.vue
import { myMixins } from "./myMixins.js";

export default {
  mixins: [myMixins],
  data() {
    return {}
  },
  mounted() {
    console.log(this.getDate1,'template1-func_one')
  }
}

打印结果:
在这里插入图片描述

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

// 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 文件中:

// todo.vue
import { myMixins } from "./myMixins.js";

export default {
  mixins: [myMixins],
  data() {
    return {}
  },
  mounted() {
    this.getDate1().then(res => {
      console.log(res,'template1-res')
    })
  }
}

打印结果:
在这里插入图片描述

七、与 vuex 的区别

vuex: 用来做状态管理的,里面定义的变量在每个组件中均可以使用和修改,在任一组件中修改此变量的值之后,其他组件中此变量的值也会随之修改。


Mixins: 可以定义共用的变量,在每个组件中使用,引用组件中之后,各个变量是相互独立的,值的修改在组件中不会相互影响。

八、与公共组件的区别

组件: 在父组件中引入组件,相当于在父组件中给出一片独立的空间供子组件使用,然后根据 prop 来传值,但本质上两者是相对独立的。


Mixins: 在引入组件之后与组件中的对象和方法进行合并,相当于扩展了父组件的对象与方法,可以理解为形成了一个新的组件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue中mixins(混入)的介绍和使用 的相关文章

随机推荐

  • QT/PyQT/PySide 通过富文本形式实现关键词高亮

    因为本质上都是QT 所以我标题带了QT 这个思路是没问题的 就是用C 得换个语言 最开始想根据之前一篇博客的思路进行高亮 PyQT PySide 文本浏览器跳转到指定行 并高亮指定行 qt 指定行高亮 Toblerone Wind的博客 C
  • 归一化互相关匹配

    设待匹配图像I的像素大小为MxN 模板T的像素大小为mxn 从图像I中任意选取一块像素大小为mxn的子图Ix y 其左上角在图像I中的坐标为 x y 可知坐标范围为 其中 M N分别为待匹配图像像素的行数和列数 m n分别为模板像素的行数和
  • [USF-XSim-62] ‘elaborate‘ step failed with errors.[Vivado 12-4473] Detected error while running sim

    USF XSim 62 elaborate step failed with error s Please check the Tcl console output and Vivado 12 4473 Detected error whi
  • linux中shell变量$#,$@,$0,$1,$2的含义解释/Shell中的${}、##和%%使用范例/export

    linux中shell变量 0 1 2的含义解释 变量说明 Shell本身的PID ProcessID Shell最后运行的后台Process的PID 最后运行的命令的结束代码 返回值 使用Set命令设定的Flag一览 所有参数列表 如 用
  • 【开集识别论文解读】Classification-Reconstruction Learning for Open-Set Recognition——CVPR2019

    论文原文 https arxiv org pdf 1812 04246v2 pdf 本文提出的CROSR利用潜在表示进行重建 并在不损害已知类别分类精度的情况下实现鲁棒未知检测 开集分类器可以检测不属于任何训练类的样本 通常 它们将概率分布
  • 机器翻译的数据预处理

    主要分为三大块 1 数据筛选 去除那些训练集中不对齐 质量差的句对 相关的技巧有很多 去重 重复的数据会使训练过程有偏 可以简单地去除完全相同的句对 也可以计算每两个句子之间的局部哈希值 把相似度小于某个阈值的句对都去除 去空行 空行不能提
  • 微信改昵称提醒服务器调试,修改微信“官方提醒”,最近超火!

    原标题 修改微信 官方提醒 最近超火 最近有一个修改微信 官方提醒 小尾巴的聊天玩法在抖音上火了 利用微信内置一个小功能套路了不少网友 效果就如封面图所示 是不是很神奇呢 具体怎么玩 来看看下面的具体操作吧 其实这个玩法是用到微信聊天里一个
  • hdu 2043 密码

    密码 Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 22640 Accepted Submissi
  • mysql数据库字段名为关键字出现的问题

    真是奇葩年年多 今天又一个 我们都知道 无论是保留字还是关键字或者特殊端口等等 都是系统预留的自用的 但是偏偏有人喜欢用这些 所以就导致其他人在用的时候出现各种错误 今天就记录一个我遇到的 关于mysql字段名的问题 今天在用sql查询时
  • 变量的 4 种存储类型

    存储类型 总共有四种存储类型的变量 分别为自动变量 auto 静态变量 static 外部变量 extern 以及寄存器变量 register auto 函数中所有的非静态局部变量 c语言可以指定类型如auto int a c 编译器不能指
  • Android开发:Eclipse中SqliteManager插件使用

    通常开发Android的时候要使用到数据库操作 会遇到下面小问题 数据库文件在哪 怎样訪问或操作 能够通过 打开DDMS gt File Explorer看到的sqlite数据库在eclipse 然后在文件夹 data data packa
  • facebook文本生成音乐项目-audiocraft 安装教程

    文章目录 所需环境 安装ffmpeg 克隆项目仓库 安装相关依赖库 运行项目 模型下载 自动下载模型失败 pytorch相关模型缓存目录 MusicGen 模型下载地址 所需环境 ffmpeg python gt 3 9 git cuda1
  • Python 通过execjs执行js代码抛出异常IndexError或语法错误

    问题 通过execjs执行JavaScript代码 虽然JavaScript代码没有语法错误 但是python解释器抛出异常IndexError list index out of range 语法错误 抛出异常语法错误的解决步骤 1 根据
  • MFC线程退出方法

    MFC使用AfxBeginThread创建线程退出方法 CWinThread myThread 线程 bool isThreadBegin false 线程退出 执行控制 创建线程 void CDlg OnButtonCreateThrea
  • python启动一个下载服务器

    1 把Desktop目录当成根目录 cd Desktop 2 python2启动下载服务器 python2 m SimpleHttpServer 3 python3启动下载服务器 python3 m http server 4 浏览器访问h
  • 解决dubbo问题:forbid consumer

    原文地址 http www jameswxx com e4 b8 ad e9 97 b4 e4 bb b6 e8 a7 a3 e5 86 b3dubbo e9 97 ae e9 a2 98 ef bc 9aforbid consumer 线
  • 应急响应(日志/流量)

    事件分类 有害程序事件 网络攻击事件 信息破坏事件 事件内容安全事件 设备设施故障事件 灾害性事件 其它事件 应急响应工作流程 准备阶段 应急团队建设 应急方案制定 等级保护测评 检测阶段 判断安全设备告警 判断事件类型 判断事件级别 确定
  • 在SQL Server 中读取 AD 信息

    http www myexception cn sql server 1011477 html EXEC sp addlinkedserver ADSI Active Directory Services 2 5 ADSDSOObject
  • CentOS7升级OpenSSL版本

    1 CentOS7 6默认安装的openssl版本为 openssl version 2 下载最新的openssl wget https www openssl org source openssl 1 1 1c tar gz wget无法
  • Vue中mixins(混入)的介绍和使用

    Vue中mixins 混入 的介绍和使用 一 什么是Mixins 二 何时使用Mixins 三 如何创建Mixins 四 如何使用Mixins 五 Mixins的特点 5 1 方法和参数在各组件中不共享 5 2 Mixins 合并冲突 5