20190122

Vue中mixin怎么理解?

mixin是为了让可复用的功能灵活的混入到当前组件中,混合的对象可以包含任意组件选项(生命周期,指令之类等等), mixin翻译过来叫混合,高级的词汇可以叫插件入侵

简单使用
// 定义一个混合对象
const myMixin = {created: function () {this.hello()},methods: {hello: function () {console.log('JS 每日一题')}}
}
// 定义一个使用混合对象的组件
const Component = Vue.extend({mixins: [myMixin]
})
var component = new Component() // JS 每日一题
选项合并(优先级)

当组件和混合对象含有同名选项时,选项会按照规则进行合并

代码理解

const mixin = {created: function () {console.log('混合对象的钩子被调用')}
}
new Vue({mixins: [mixin],created: function () {console.log('组件钩子被调用')}
})// => "混合对象的钩子被调用"
// => "组件钩子被调用"
// 从上面的代码我们可以看出来混合对象的生命周期会被先调用

值为对象的选项,例如 methods, components 和 directives,将被混合为同一个对象。两个对象键名冲突时,取组件对象的键值对,Vue.extend() 也使用同样的策略进行合并。

代码理解

const mixin = {methods: {foo: function () {console.log('foo')},conflicting: function () {console.log('from mixin')}}
}
const vm = new Vue({mixins: [mixin],methods: {bar: function () {console.log('bar')},conflicting: function () {console.log('from self')}}
})
vm.foo() // => "foo"
vm.bar() // => "bar"
vm.conflicting() // => "from self"
全局混合

也可以全局注册混合对象。注意使用! 一旦使用全局混合对象,将会影响到 所有 之后创建的 Vue 实例

// 为自定义的选项 'myOption' 注入一个处理器。
Vue.mixin({created: function () {var myOption = this.$options.myOptionif (myOption) {console.log(myOption)}}
})
new Vue({myOption: 'hello!'
})
// => "hello!"

再了解了基本用法后再简单过一遍源码加深印象

// 源码地址 https://github.com/vuejs/vue/blob/52719ccab8fccffbdf497b96d3731dc86f04c1ce/src/core/util/options.js#L365export function mergeOptions (parent: Object,child: Object,vm?: Component
): Object { // flow语法,表明返回的是一个对象if (process.env.NODE_ENV !== 'production') {checkComponents(child)}if (typeof child === 'function') {child = child.options}normalizeProps(child, vm)normalizeInject(child, vm)normalizeDirectives(child)const extendsFrom = child.extends//若存在extends,则将其内容合并到父对象parent中保存,最后再和自身child合并if (extendsFrom) {parent = mergeOptions(parent, extendsFrom, vm)}// 若存在mixins,则将其内容合并到父对象parent中保存,最后再和自身child合并if (child.mixins) {for (let i = 0, l = child.mixins.length; i < l; i++) {parent = mergeOptions(parent, child.mixins[i], vm)}}//初始化一个对象,用于存储parent和child合并后的内容,并作为mergeOptions函数的结果返回const options = {}let keyfor (key in parent) {mergeField(key)}for (key in child) {if (!hasOwn(parent, key)) {mergeField(key)}}//使用策略对象对parent和child进行合并function mergeField (key) {const strat = strats[key] || defaultStratoptions[key] = strat(parent[key], child[key], vm, key)}return options
}export function initMixin (Vue: GlobalAPI) {Vue.mixin = function (mixin: Object) {this.options = mergeOptions(this.options, mixin)return this}
}

总结

mixin就是采取一定规则将一个功能(组件)的属性混合到另一个组件或者全局当中,优点就是灵活度高,耦合度低,便于维护

关于JS每日一题

JS每日一题可以看成是一个语音答题社区
每天利用碎片时间采用60秒内的语音形式来完成当天的考题
群主在次日0点推送当天的参考答案

  • 注 绝不仅限于完成当天任务,更多是查漏补缺,学习群内其它同学优秀的答题思路

搜索微信公众号:JS每日一题

JS每日一题: Vue中mixin怎么理解?相关推荐

  1. JS每日一题:vue中keepalive怎么理解?

    20190212问 vue中keepalive怎么理解? 说在前面: keep-alive是vue源码中实现的一个组件, 感兴趣的可以研究源码 https://github.com/vuejs/vue ...

  2. JS每日一题:Vue中的diff算法?

    20190125 Vue中的diff算法? 概念: diff算法是一种优化手段,将前后两个模块进行差异对比,修补(更新)差异的过程叫做patch(打补丁) 为什么vue,react这些框架中都会有di ...

  3. JS每日一题:new Vue()中发生了什么?

    20190214问 new Vue()中发生了什么? 先从语法上分析,new关键字在js语言中代表实例化一个对象, 而Vue实际上是一个类, 我们简单看一下源码 源码地址 https://github ...

  4. JS每日一题: 小程序页面之间如何通信?

    20190227 小程序页面之间如何通信? 首先将通信的模型列举出来, 分为以下几种 兄弟页面间通信 父路径页面向子路径页面通信 子路径页面向父路径页面通信 通信的方式 localStorage 本地 ...

  5. mixin机制 vue_谈谈vue中mixin的一点理解

    谈谈vue中mixin的一点理解 vue中提供了一种混合机制--mixins,用来更高效的实现组件内容的复用.最开始我一度认为这个和组件好像没啥区别..后来发现错了.下面我们来看看mixins和普通情 ...

  6. Vue中$refs的理解

    Vue中$refs的理解 $refs是一个对象,持有注册过ref attribute的所有DOM元素和组件实例. 描述 ref被用来给元素或子组件注册引用信息,引用信息将会注册在父组件的$refs对象 ...

  7. Vue中$nextTick的理解

    Vue中$nextTick的理解 Vue中$nextTick方法将回调延迟到下次DOM更新循环之后执行,也就是在下次DOM更新循环结束之后执行延迟回调,在修改数据之后立即使用这个方法,能够获取更新后的 ...

  8. [vue] 说说你对vue的mixin的理解,有什么应用场景?

    [vue] 说说你对vue的mixin的理解,有什么应用场景? mixins 就是混入.一个混入对象可以包含任意组件选项.同一个生命周期,混入对象会比组件的先执行.//暴露两个mixins对象 exp ...

  9. vue中mixin 感觉很牛逼(父子组件融合成一个新组件)

    vue中提供了一种混合机制--mixins,用来更高效的实现组件内容的复用.最开始我一度认为这个和组件好像没啥区别..后来发现错了.下面我们来看看mixins和普通情况下引入组件有什么区别? 组件在引 ...

  10. Vue中mixin的使用

    什么是混入? 混入通过注入配置项到vue实例用来提升复用性 1. 基础使用 const myMixin = {created: function () {this.hello();},methods: ...

最新文章

  1. c语言程序设计论文结构,c语言顺序结构设计实验报告.docx
  2. Intel Realsense D435 将深度图的灰度图映射为彩色图,打印输出灰度图或彩色图
  3. HTML中href src区别,html中 href 和 src 的定义与区别
  4. 记录Ubuntu Windows下安装PyV8
  5. 解决win10安卓虚拟机每十几分钟蓝屏重启问题
  6. Java并发编程实战————并发技巧小结
  7. Asp.net三层结构原理与用意学习入门教程(一)
  8. devops工程师_DevOps工程师的认证
  9. bzoj 3039: 玉蟾宫(悬线法)
  10. 学生信息表 -通过选择年级和班级得到详细的学生信息名单
  11. HTTP协议详解(真的很经典)(转载)
  12. mark制图软件_绘图软件有哪些?
  13. 开源网络负载测试工具测评
  14. 甘特图是什么意思?甘特图制作步骤教程
  15. 解析HTTP协议六种请求方法
  16. oracle18c静默安装教程,Oracle 18c 19c 安装的 DBT-50000 错误解决
  17. STM32F407的时钟
  18. Android12之OpenSL ES中Realize实例化AudioManager(十二)
  19. 蓝牙耳机+大鼠标垫+笔记本电脑支架
  20. 快钱 大数据改变第三方支付

热门文章

  1. C#中实现拖拽功能,补全中
  2. 基于麻雀搜索算法的极限学习机(ELM)回归预测 -附代码
  3. C++内置数组和array的比较
  4. 【Arcpy】Arcpy核心
  5. Oracle自定义函数示例
  6. Android studio java.lang.UnsatisfiedLinkError加载.so文件失败解决办法
  7. fopen php 读取_PHP fopen读取url内容
  8. 实习踩坑之路:实习以来获得的踩坑经验、一些提升开发效率的方法或者常用技巧
  9. 图解HTTP协议笔记
  10. 嵌入式linux寄存器移位寻址,嵌入式系统及应用》 (32+16)教学大纲