背景
在需求中,采用 vue mixin(混入)实现业务全量覆盖,但由于没有考虑平台差异性,导致了页面报错。业务的原因与 vue mixin 有关,分析了实现原理总结如下:
data 属性合并:
data属性的合并主要是 mergeDataOrFn和mergeData:
mergeDataOrFn的实现很简单,主要是判断两者之间是否有一个没有 data属性,是则直接返回有 data属性的一方,否则返回一个两者合并结果的函数;
mergeData是两者合并的过程:
如果是后者没有的变量,则把该变量加入到后者的 data属性;
如果两个值都是对象,但是值不相等,则进行对象的合并;
如果 key值相等,但是值不相等,则以后者的为准;
生命周期相关的合并:
生命周期钩子函数的合并比较简单,先判断后者的生命周期钩子函数是否存在,是则将后者的相应生命周期钩子函数拼接到前者后面;
components、directives、filters 的合并:
components、directives、filters的合并是先拷贝一份原先的属性对象,然后对拷贝的对象进行扩展,它会遍历传入的对象,将传入对象的属性赋值给拷贝对象,如果有重复的,则后者覆盖前者;
watch 合并:
watch的合并和生命周期钩子函数有点相似,都是把后者的属性拼接到前者属性的后面;
props、methods、inject、computed、provide 的合并:
props、methods、inject、computed的合并都是先定义一个对象 ret,先遍历前者的属性或方法,对 ret进行扩展,如果后者有相应的props、methods、inject、computed等属性,则将后者的覆盖前者的属性或方法
总结
混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。mixin具体实现是通过采用策略模式来将数据进行合并:
mixin对业务代码侵入性较强,建议生命周期中采用 try catch 包裹
优先级是: 前者 --> 后者 在开发时需要注意。
举个例子: