详解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实现购物小球抛物线的方法实例
Nov 22 Vue.js
vue中defineProperty和Proxy的区别详解
Nov 30 Vue.js
Vue如何实现验证码输入交互
Dec 07 Vue.js
Vue与React的区别和优势对比
Dec 18 Vue.js
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 Vue.js
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 Vue.js
vue打开新窗口并实现传参的图文实例
Mar 04 Vue.js
Vue项目中如何封装axios(统一管理http请求)
May 02 Vue.js
vue中利用mqtt服务端实现即时通讯的步骤记录
Jul 01 Vue.js
前端vue+express实现文件的上传下载示例
Feb 18 Vue.js
vue封装数字翻牌器
Apr 20 Vue.js
vue里使用create, mounted调用方法
Apr 26 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 ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
php数组去除空值函数分享
2015/02/02 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
基于jquery的关于动态创建DOM元素的问题
2010/12/24 Javascript
silverlight线程与基于事件驱动javascript引擎(实现轨迹回放功能)
2011/08/09 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
js document.write()使用介绍
2014/02/21 Javascript
JavaScript实现存储HTML字符串示例
2014/04/21 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
详解jQuery uploadify文件上传插件的使用方法
2016/12/16 Javascript
jQuery实现拖拽可编辑模块功能代码
2017/01/12 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
javaScript之split与join的区别(详解)
2017/11/08 Javascript
vue实现移动端H5数字键盘组件使用详解
2020/08/25 Javascript
[56:48]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
python 数据加密代码
2008/12/24 Python
详细介绍Ruby中的正则表达式
2015/04/10 Python
Python 专题六 局部变量、全局变量global、导入模块变量
2017/03/20 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
python删除某个字符
2018/03/19 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
Python人工智能之路 之PyAudio 实现录音 自动化交互实现问答
2019/08/13 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
CSS3实现时间轴特效
2020/11/02 HTML / CSS
STUBHUB日本:购买和出售全球活动门票
2018/07/01 全球购物
学生会个人自荐书范文
2014/02/12 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
广告设计应届生求职信
2014/03/01 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
2015年人力资源工作总结
2015/04/08 职场文书
高二数学教学反思
2016/02/18 职场文书
Python opencv缺陷检测的实现及问题解决
2021/04/24 Python
JVM之方法返回地址详解
2022/02/28 Java/Android