详解Vue的mixin策略


Posted in Vue.js onNovember 19, 2020

我之前一直以为mixin的合并是以组件内的优先,即mixin的内容如果和组件内有冲突的,以组件内为准,确实存在这种情况,但是vue指定的策略更详细,下面分别记录各种情况对应的合并策略

基本

当一个组件使用mixin的时候,所有mixin的选项会被混入到组件自己的选项中, 这部分没什么好说的,直接看代码

// define a mixin object
const myMixin = {
 created() {
  this.hello()
 },
 methods: {
  hello() {
   console.log('hello from mixin!')
  }
 }
}

// define an app that uses this mixin
const app = Vue.createApp({
 mixins: [myMixin]
})

app.mount('#mixins-basic') // => "hello from mixin!"

选项的合并策略

这里的选项指的就是 data methods和生命周期钩子函数这些选项,他们的会采取不同的合并策略

像data,methods,components,directives这样的会被合并进同一个对象中,并且遇到冲突项以组件的为准

const myMixin = {
 data() {
  return {
   message: 'hello',
   foo: 'abc'
  }
 }
}

const app = Vue.createApp({
 mixins: [myMixin],
 data() {
  return {
   message: 'goodbye',
   bar: 'def'
  }
 },
 created() {
  console.log(this.$data) // => { message: "goodbye", foo: "abc", bar: "def" }
 }
})
const myMixin = {
 methods: {
  foo() {
   console.log('foo')
  },
  conflicting() {
   console.log('from mixin')
  }
 }
}

const app = Vue.createApp({
 mixins: [myMixin],
 methods: {
  bar() {
   console.log('bar')
  },
  conflicting() {
   console.log('from self')
  }
 }
})

const vm = app.mount('#mixins-basic')

vm.foo() // => "foo"
vm.bar() // => "bar"
vm.conflicting() // => "from self"

而对于钩子函数就不是简单的替换了,如果有同名的,他们会被一起合并进数组中,然后依次调用,且mixin的钩子函数会率先被调用

const myMixin = {
 created() {
  console.log('mixin hook called')
 }
}

const app = Vue.createApp({
 mixins: [myMixin],
 created() {
  console.log('component hook called')
 }
})

// => "mixin hook called"
// => "component hook called"

全局混入和自定义选项

const app = Vue.createApp({
 myOption: 'hello!'
})

// inject a handler for `myOption` custom option
app.mixin({
 created() {
  const myOption = this.$options.myOption
  if (myOption) {
   console.log(myOption)
  }
 }
})

app.mount('#mixins-global') // => "hello!"

上述代码,我们在全局创建了一个自定义选项,然后进行了全局混入处理,但是需要注意的是,这会影响到这个app所有的子组件:

const app = Vue.createApp({
 myOption: 'hello!'
})

// inject a handler for `myOption` custom option
app.mixin({
 created() {
  const myOption = this.$options.myOption
  if (myOption) {
   console.log(myOption)
  }
 }
})

// add myOption also to child component
app.component('test-component', {
 myOption: 'hello from component!'
})

app.mount('#mixins-global')

// => "hello!"
// => "hello from component!"

我们可以看到,对于自定义选项这不是简单的替换,而是分别调用,当然我们也可以制定我们自己的合并策略:

const app = Vue.createApp({})

app.config.optionMergeStrategies.customOption = (toVal, fromVal) => {
 // return mergedVal
}

合并策略接收两个参数,分别是指定项在父实例和子实例的值,当使用mixin的时候我们可以查看打印什么:

const app = Vue.createApp({
 custom: 'hello!'
})

app.config.optionMergeStrategies.custom = (toVal, fromVal) => {
 console.log(fromVal, toVal)
 // => "goodbye!", undefined
 // => "hello", "goodbye!"
 return fromVal || toVal
}

app.mixin({
 custom: 'goodbye!',
 created() {
  console.log(this.$options.custom) // => "hello!"
 }
})

可以看到第一次从mixin打印,然后从app打印。

注意事项

  • mixin很容易造成冲突,你得确保不会有冲突的属性名,来避免冲突,这会造成额外的负担
  • 复用性有限,因为mixin不能接受参数,所以逻辑是写定的,不灵活

所以官方推荐使用 Composition Api来组织逻辑

以上就是详解Vue的mixin策略的详细内容,更多关于Vue的mixin策略的资料请关注三水点靠木其它相关文章!

Vue.js 相关文章推荐
vue+iview实现文件上传
Nov 17 Vue.js
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
Nov 20 Vue.js
详解Vue中的自定义指令
Dec 07 Vue.js
vue3使用vue-count-to组件的实现
Dec 25 Vue.js
Vue.extend 登录注册模态框的实现
Dec 29 Vue.js
vue实现简易计算器功能
Jan 20 Vue.js
基于vue的video播放器的实现示例
Feb 19 Vue.js
Vue中避免滥用this去读取data中数据
Mar 02 Vue.js
vue 数据双向绑定的实现方法
Mar 04 Vue.js
Vue如何实现组件间通信
May 15 Vue.js
vue使用节流函数的踩坑实例指南
May 20 Vue.js
Vue监视数据的原理详解
Feb 24 Vue.js
一篇超完整的Vue新手入门指导教程
Nov 18 #Vue.js
vue3.0实现点击切换验证码(组件)及校验
Nov 18 #Vue.js
在Vue中使用Echarts可视化库的完整步骤记录
Nov 18 #Vue.js
详解vue实现坐标拾取器功能示例
Nov 18 #Vue.js
Vue如何循环提取对象数组中的值
Nov 18 #Vue.js
vue在图片上传的时候压缩图片
Nov 18 #Vue.js
Vue +WebSocket + WaveSurferJS 实现H5聊天对话交互的实例
Nov 18 #Vue.js
You might like
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
CL vs ForZe BO5 第一场 2.13
2021/03/10 DOTA
jQuery对象和DOM对象的相互转化实现代码
2010/03/02 Javascript
用jquery实现输入框获取焦点消失文字
2013/04/27 Javascript
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
2013/06/04 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
jQuery实现图片与文字描述左右滑动自动切换的方法
2015/07/27 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
解决vue项目报错webpackJsonp is not defined问题
2018/03/14 Javascript
JavaScript数组特性与实践应用深入详解
2018/12/30 Javascript
[54:41]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VGJ.T VS paiN
2018/03/31 DOTA
python实现数值积分的Simpson方法实例分析
2015/06/05 Python
深入解析Python中函数的参数与作用域
2016/03/20 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
python 梯度法求解函数极值的实例
2019/07/10 Python
python数组循环处理方法
2019/08/26 Python
Python使用Paramiko控制liunx第三方库
2020/05/20 Python
HTML5 placeholder属性详解
2016/06/22 HTML / CSS
计算机专业自我鉴定
2013/10/15 职场文书
模具设计与制造专业应届生求职信
2013/10/18 职场文书
编辑找工作求职信范文
2013/12/16 职场文书
超市后勤自我鉴定
2014/01/17 职场文书
优秀企业获奖感言
2014/02/01 职场文书
空乘英文求职信
2014/04/13 职场文书
2014年安全生产责任书
2014/07/22 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
优秀党员先进材料
2014/12/18 职场文书
践行三严三实心得体会(2016推荐篇)
2016/01/06 职场文书
学习心得体会
2019/06/20 职场文书
MySQL查询日期时间
2022/05/15 MySQL