Vue2 混入原理

107 阅读2分钟

背景

在需求中,采用 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 包裹

优先级是: 前者 --> 后者 在开发时需要注意。

举个例子: