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 相关文章推荐
关于Javascript模块化和命名空间管理的问题说明
Dec 06 Javascript
jquery下为Event handler传递动态参数的代码
Jan 06 Javascript
javascript 事件处理程序介绍
Jun 27 Javascript
jQuery实现仿百度首页滑动伸缩展开的添加服务效果代码
Sep 09 Javascript
jquery UI Datepicker时间控件的使用及问题解决
Apr 28 Javascript
Winform客户端向web地址传参接收参数的方法
May 17 Javascript
jquery判断input值不为空的方法
Jun 05 Javascript
BootStrap Table 分页后重新搜索问题的解决办法
Aug 08 Javascript
JS实现颜色梯度与渐变效果完整实例
Dec 30 Javascript
微信小程序 获取二维码实例详解
Jun 23 Javascript
JS仿QQ好友列表展开、收缩功能(第二篇)
Jul 07 Javascript
Bootstrap-table使用footerFormatter做统计列功能
Sep 07 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
php+mysql写的简单留言本实例代码
2008/07/25 PHP
PHP 巧用数组降低程序的时间复杂度
2010/01/01 PHP
php封装的smarty类完整实例
2016/10/19 PHP
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
基于prototype扩展的JavaScript常用函数库
2010/11/30 Javascript
Array 重排序方法和操作方法的简单实例
2014/01/24 Javascript
详解AngularJS中的作用域
2015/06/17 Javascript
微信JSSDK上传图片
2015/08/23 Javascript
基于jquery实现页面滚动到底自动加载数据的功能
2015/12/19 Javascript
基于jQuery实现美观且实用的倒计时实例代码
2015/12/30 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
2016/11/29 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
基于vue中css预加载使用sass的配置方式详解
2018/03/13 Javascript
puppeteer库入门初探
2019/01/09 Javascript
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
ant-design-vue 实现表格内部字段验证功能
2019/12/16 Javascript
JS实现简单贪吃蛇小游戏
2020/10/28 Javascript
[52:44]VGJ.T vs infamous Supermajor小组赛D组败者组第一轮 BO3 第一场 6.3
2018/06/04 DOTA
[00:43]拉比克至宝魔导师密钥展示
2018/12/20 DOTA
17个Python小技巧分享
2015/01/23 Python
python获取文件路径、文件名、后缀名的实例
2018/04/23 Python
对pandas中时间窗函数rolling的使用详解
2018/11/28 Python
python中四舍五入的正确打开方式
2021/01/18 Python
中专毕业生自我鉴定
2014/02/02 职场文书
国庆节文艺活动方案
2014/02/03 职场文书
书法兴趣小组活动总结
2014/07/07 职场文书
2014年党小组工作总结
2014/12/20 职场文书
2015年度优秀员工推荐信
2015/03/23 职场文书
新员工试用期工作总结2015
2015/05/28 职场文书
远程教育集中轮训基层干部培训班学习心得体会
2016/01/09 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
CSS巧用渐变实现高级感背景光动画
2021/12/06 HTML / CSS
如何通过一篇文章了解Python中的生成器
2022/04/02 Python
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js