详解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解决移动端弹窗滚动穿透问题
Dec 15 Vue.js
Vue实现手机号、验证码登录(60s禁用倒计时)
Dec 19 Vue.js
vue3中轻松实现switch功能组件的全过程
Jan 07 Vue.js
vue watch监控对象的简单方法示例
Jan 07 Vue.js
vue keep-alive的简单总结
Jan 25 Vue.js
Vite和Vue CLI的优劣
Jan 30 Vue.js
如何在vue中使用video.js播放m3u8格式的视频
Feb 01 Vue.js
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
springboot+VUE实现登录注册
May 27 Vue.js
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
vue中 this.$set的使用详解
Nov 17 Vue.js
vue项目支付功能代码详解
Feb 18 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
世界收音机发展史
2021/03/01 无线电
php简单中奖算法(实例)
2017/08/15 PHP
php模拟post提交请求调用接口示例解析
2020/08/07 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
JQuery使用$.ajax和checkbox实现下次不在通知功能
2015/04/16 Javascript
JavaScript中constructor()方法的使用简介
2015/06/05 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
JS 通过系统时间限定动态添加 select option的实例代码
2016/06/09 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
html5 canvas 详细使用教程
2017/01/20 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
以v-model与promise两种方式实现vue弹窗组件
2018/05/21 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
vue无限轮播插件代码实例
2019/05/10 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
使用python绘制人人网好友关系图示例
2014/04/01 Python
Python实现接受任意个数参数的函数方法
2018/04/21 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
从0开始的Python学习014面向对象编程(推荐)
2019/04/02 Python
python保留小数位的三种实现方法
2020/01/07 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
财产公证书
2014/04/10 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
社区维稳工作方案
2014/06/06 职场文书
语文教育专业求职信
2014/06/28 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
活动主持人开场白
2015/05/28 职场文书
学风建设主题班会
2015/08/17 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书
Android RecyclerView实现九宫格效果
2022/06/28 Java/Android