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 相关文章推荐
些很实用且必用的小脚本代码
Jun 26 Javascript
鼠标图片振动代码
Jul 06 Javascript
js 鼠标拖动对象 可让任何div实现拖动效果
Nov 09 Javascript
利用js动态添加删除table行的示例代码
Dec 16 Javascript
jQuery学习笔记之jQuery.extend(),jQuery.fn.extend()分析
Jun 09 Javascript
JavaScript function 的 length 属性使用介绍
Sep 15 Javascript
Javascript 中创建自定义对象的方法汇总
Dec 04 Javascript
js与css实现弹出层覆盖整个页面的方法
Dec 13 Javascript
jQuery实现鼠标划过展示大图的方法
Mar 09 Javascript
在线所见即所得HTML编辑器的实现原理浅析
Apr 25 Javascript
解决JS请求服务器gbk文件乱码的问题
Oct 16 Javascript
jQuery仿写百度百科的目录树
Jan 03 Javascript
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
1982年日本摄影师镜头下的中国孩子 那无忧无虑的童年
2020/03/12 杂记
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
String.prototype实现的一些javascript函数介绍
2013/11/22 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
使用gulp搭建本地服务器并实现模拟ajax
2017/04/05 Javascript
jQuery实现广告条滚动效果
2017/08/22 jQuery
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
详解ES6通过WeakMap解决内存泄漏问题
2018/03/09 Javascript
对Vue table 动态表格td可编辑的方法详解
2018/08/28 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
vue 使用vue-i18n做全局中英文切换的方法
2018/10/29 Javascript
JS使用Prim算法和Kruskal算法实现最小生成树
2019/01/17 Javascript
VuePress 快速踩坑小结
2019/02/14 Javascript
jQuery实现html可联动的百分比进度条
2020/03/26 jQuery
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
[48:38]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs Secret
2018/03/31 DOTA
Python中.py文件打包成exe可执行文件详解
2017/03/22 Python
Python 获取ftp服务器文件时间的方法
2019/07/02 Python
python基于json文件实现的gearman任务自动重启代码实例
2019/08/13 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
Python run()函数和start()函数的比较和差别介绍
2020/05/03 Python
ivx平台开发之不用代码实现一个九宫格抽奖功能
2021/01/27 HTML / CSS
Currentbody德国站:健康与美容技术专家
2020/04/05 全球购物
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
计算机专业求职信
2014/06/02 职场文书
企业读书活动总结
2014/06/30 职场文书
田径运动会通讯稿
2014/09/13 职场文书
80后创业总结的9条职场用人思想,记得收藏
2019/08/13 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle