vue2源码-十二、mixin的使用和原理
mixin的使用和原理
使用:
可以通过
Vue.mixin
来实现逻辑的复用,问题在于数据来源不明确。声明的时候可能对导致命名冲突vue3
采用的就是compositionAPI
局部混入:
var myMixin = { created: function () { this.hello() }, methods: { hello: function () { console.log('hello from mixin!') } } } // 混入 Vue.component('componentA',{ mixins: [myMixin] })
全局混入
Vue.mixin({ created: function () { console.log("全局混入") } })
原理:
初始化混入
initMixin
export function initMixin(Vue: GlobalAPI) { Vue.mixin = function (mixin: Object) { // this==Vue // 最终合并将mixin对象和Vue.options合并在一起 this.options = mergeOptions(this.options, mixin); return this; }; }
主要是
mergeOptions
方法。分析这个函数:将
options
合并,最终合并将mixin
对象和Vue.options
合并在一起
export function mergeOptions ( parent: Object, child: Object, vm?: Component ): Object { if (child.mixins) { // 判断有没有mixin 也就是mixin里面挂mixin的情况 有的话递归进行合并 for (let i = 0, l = child.mixins.length; i < l; i++) { parent = mergeOptions(parent, child.mixins[i], vm) } } const options = {} let key for (key in parent) { mergeField(key) // 先遍历parent的key 调对应的strats[XXX]方法进行合并 } for (key in child) { if (!hasOwn(parent, key)) { // 如果parent已经处理过某个key 就不处理了 mergeField(key) // 处理child中的key 也就parent中没有处理过的key } } // 策略模式 function mergeField (key) { const strat = strats[key] || defaultStrat options[key] = strat(parent[key], child[key], vm, key) // 根据不同类型的options调用strats中不同的方法进行合并 } return options }
注意:
- 优先递归处理
mixins
- 先遍历合并
parent
中key
,调用mergeField
方法进行合并,然后保存变量options
- 再遍历
child
,合并补上parent
中没有的key
,调用mergeField
方法进行合并,保存在变量options
- 通过
mergeField
函数进行了合并
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南