Vue初始化中的选项合并之initInternalComponent详解


Posted in Javascript onJune 11, 2020

今天给大家分享Vue初始化中的选项合并之initInternalComponent的相关知识,具体代码如下所示:

export function initInternalComponent (vm: Component, options: InternalComponentOptions) {
 const opts = vm.$options = Object.create(vm.constructor.options)
 // doing this because it's faster than dynamic enumeration.
 const parentVnode = options._parentVnode
 opts.parent = options.parent
 opts._parentVnode = parentVnode

 const vnodeComponentOptions = parentVnode.componentOptions
 opts.propsData = vnodeComponentOptions.propsData
 opts._parentListeners = vnodeComponentOptions.listeners
 opts._renderChildren = vnodeComponentOptions.children
 opts._componentTag = vnodeComponentOptions.tag

 if (options.render) {
  opts.render = options.render
  opts.staticRenderFns = options.staticRenderFns
 }
}

initInternalComponent方法接受两个参数,第一个参数是组件实例,即this。第二个参数是组件构造函数中传入的option,这个option根据上文的分析,他是在createComponentInstanceForVnode方法中定义的:

export function createComponentInstanceForVnode (
 vnode: any, // we know it's MountedComponentVNode but flow doesn't
 parent: any, // activeInstance in lifecycle state
): Component {
 const options: InternalComponentOptions = {
  _isComponent: true,
  _parentVnode: vnode,
  parent
 }
 // check inline-template render functions
 const inlineTemplate = vnode.data.inlineTemplate
 if (isDef(inlineTemplate)) {
  options.render = inlineTemplate.render
  options.staticRenderFns = inlineTemplate.staticRenderFns
 }
 return new vnode.componentOptions.Ctor(options)
}

option中有三个属性值,_isComponent上面已经提到过了;_parentVode其实就是该组件实例的vnode对象(createComponentInstanceForVnode就是根据这个vnode对象去创建一个组件实例);parent则是该组件的父组件实例对象。
然后我们来看看具体initInternalComponent做了什么操作:

const opts = vm.$options = Object.create(vm.constructor.options)

首先,用Object.create这个函数,把组件构造函数的options挂载到vm.$options__proto__上。

const parentVnode = options._parentVnode
opts.parent = options.parent
opts._parentVnode = parentVnode

接下把传入参数的option的_parentVodeparent挂载到组件实例$options上。用我们在两种策略里的那个例子来说,parent就是我们组件的根实例,而_parentVnode就是<comp :msg="msg" @log-msg="logMsg"></comp>生成的一个Vnode对象。

const vnodeComponentOptions = parentVnode.componentOptions
opts.propsData = vnodeComponentOptions.propsData
opts._parentListeners = vnodeComponentOptions.listeners
opts._renderChildren = vnodeComponentOptions.children
opts._componentTag = vnodeComponentOptions.tag

然后把父组件里的vnode上的四个属性挂载到我们的$options上,还是用那个例子来说,propsData就是根据:msg="msg"生成的,他的值就是在根组件里定义的那个msg{msg: "props-message"}。而_parentListeners就是根据@log-msg="logMsg"生成的,他的值是logMsg这个定义在父组件中的方法。

if (options.render) {
  opts.render = options.render
  opts.staticRenderFns = options.staticRenderFns
}

最后就是如果传入的option中如果有render,把render相关的也挂载到$options上。
因此,这个initInternalComponent主要做了两件事情:1.指定组件$options原型,2.把组件依赖于父组件的props、listeners也挂载到options上,方便子组件调用。

总结

到此这篇关于Vue初始化中的选项合并之initInternalComponent详解的文章就介绍到这了,更多相关Vue初始化选项合并内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
ImageFlow可鼠标控制图片滚动
Jan 30 Javascript
jquery如何判断表格同一列不同行input数据是否重复
May 14 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
Sep 04 Javascript
js钢琴按钮波浪式图片排列效果代码分享
Aug 26 Javascript
Angularjs中如何使用filterFilter函数过滤
Feb 06 Javascript
javascript实现起伏的水波背景效果
May 16 Javascript
AngularJs IE Compatibility 兼容老版本IE
Sep 01 Javascript
JS中如何实现复选框全选功能
Dec 19 Javascript
loading动画特效小结
Jan 22 Javascript
jQuery.Form实现Ajax上传文件同时设置headers的方法
Jun 26 jQuery
Vue form表单动态添加组件实战案例
Sep 02 Javascript
jQuery实现简单聊天室
Feb 08 jQuery
Vue组件为什么data必须是一个函数
Jun 11 #Javascript
Vue实现点击箭头上下移动效果
Jun 11 #Javascript
webpack+express实现文件精确缓存的示例代码
Jun 11 #Javascript
详解vue 组件
Jun 11 #Javascript
vue实现员工信息录入功能
Jun 11 #Javascript
JavaScript Event Loop相关原理解析
Jun 10 #Javascript
vue Element左侧无限级菜单实现
Jun 10 #Javascript
You might like
php 设计模式之 单例模式
2008/12/19 PHP
php 7新特性之类型申明详解
2017/06/06 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
php中用unset销毁变量并释放内存
2020/05/10 PHP
csdn 博客的css样式 v3
2009/02/24 Javascript
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
js中getBoundingClientRect的作用及兼容方案详解
2018/02/01 Javascript
Vue事件修饰符native、self示例详解
2019/07/09 Javascript
vue 使用鼠标滚动加载数据的例子
2019/10/31 Javascript
[40:10]2015国际邀请赛全明星表演赛
2015/08/07 DOTA
Python对ElasticSearch获取数据及操作
2019/04/24 Python
python适合人工智能的理由和优势
2019/06/28 Python
django 通过URL访问上传的文件方法
2019/07/28 Python
Python基于Socket实现简单聊天室
2020/02/17 Python
Jupyter Notebook打开任意文件夹操作
2020/04/14 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
python 实现Requests发送带cookies的请求
2021/02/08 Python
手把手教你用Django执行原生SQL的方法
2021/02/18 Python
css3隔行变换色实现示例
2014/02/19 HTML / CSS
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
COACH德国官方网站:纽约现代奢侈品牌,1941年
2018/06/09 全球购物
银行实习生自我鉴定范文
2013/09/19 职场文书
客服部班长工作责任制
2014/02/25 职场文书
研修心得体会
2014/09/04 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
2014乡镇党委副书记对照检查材料思想汇报
2014/10/09 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书