You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
exportfunctionresolveConstructorOptions(Ctor: Class<Component>){let options =Ctor.optionsif(Ctor.super){// 把父类的options找出来,因为可能父类也有父类,因此这里是递归查找,把`parents`上的所有options都合并到当前。const superOptions =resolveConstructorOptions(Ctor.super)constcachedSuperOptions=Ctor.superOptions//如果找到了,那么就把父类的 `options`和当前的 `options`进行一次合并。if(superOptions!==cachedSuperOptions){// super option changed,// need to resolve new options.
Ctor.superOptions=superOptions// check if there are any late-modified/attached options (#4976)constmodifiedOptions=resolveModifiedOptions(Ctor)// update base extend optionsif(modifiedOptions){extend(Ctor.extendOptions,modifiedOptions)}options=Ctor.options=mergeOptions(superOptions,Ctor.extendOptions)if(options.name){options.components[options.name]=Ctor//如果指定了`name`,那么在自己身上注册一下自己。这样就可以直接在模板中用了。}}}returnoptions}
在正式说数据响应化之前,先让我们简单说下options的处理,其实对
options
的处理过程也挺复杂,但是这些细节并不是本文关注的重点,所这里我们只挑它的主要代码讲,至于一些细节比如如何进行normalize
等有兴趣的话可以自己看看源码。正如上图所示,我们上一章讲到过,在
_init
函数中,有这么一段代码进行options
的合并,生成一个新的this.$options
。当然实际情况比这个图要复杂些。这一段代码主要调用了两个函数
resolveConstructorOptions
和mergeOptions
,让我们从调用顺序来分别看看这两个函数的作用。resolveConstructorOptions
会递归向super
查找options
,如果找到了,那么就把父类的options
和当前的options
进行合并。可能大家会有疑问,哪里来的父类呢?我们一般有两种方式来创建一个Vue组件:
那么我们再看第二个函数,也就是
mergeOptions
,顾名思义,就是把几个不同的options
合并成同一个,mergeOptions
函数的定义在core/util/options.js
中。因为options中有很多字段,不同字段的处理方式会不同,比如有些字段就会子类覆盖父类,有些字段可能就需要把值合并起来。我们先看看mergeOptions
函数:好了,我们已经大致知道了
Vue
是如何处理options
的,下面让我们正式进入数据响应化吧。下一篇:Vue2.x源码解析系列四:数据响应之Observer
The text was updated successfully, but these errors were encountered: