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 相关文章推荐
setInterval 和 setTimeout会产生内存溢出
Feb 15 Javascript
Ext grid 添加右击菜单
Nov 26 Javascript
JavaScript Event学习第七章 事件属性
Feb 07 Javascript
JQuery 文本框使用小结
May 22 Javascript
用Jquery选择器计算table中的某一列某一行的合计
Aug 13 Javascript
jquery获取radio值(单选组radio)
Oct 16 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
Dec 08 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
Sep 20 Javascript
node.js的exports、module.exports与ES6的export、export default深入详解
Oct 26 Javascript
详解vue-cli3多环境打包配置
Mar 28 Javascript
超轻量级的js时间库miment使用解析
Aug 02 Javascript
微信小程序实现翻牌抽奖动画
Sep 21 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
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
PHP学习笔记之字符串编码的转换和判断
2014/05/22 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
JS判断页面加载状态以及添加遮罩和缓冲动画的代码
2012/10/11 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
2015/01/28 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
Express框架之connect-flash详解
2017/05/31 Javascript
让bootstrap的carousel支持滑动滚屏的实现代码
2017/11/27 Javascript
javascript中的隐式调用
2018/02/10 Javascript
详解redux异步操作实践
2018/08/15 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
移动端H5页面返回并刷新页面(BFcache)的方法
2018/11/06 Javascript
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
Layer.js实现表格溢出内容省略号显示,悬停显示全部的方法
2019/09/16 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
[10:39]DOTA2上海特级锦标赛音乐会纪录片
2016/03/21 DOTA
Python3读取文件常用方法实例分析
2015/05/22 Python
python3爬取各类天气信息
2018/02/24 Python
python求最大连续子数组的和
2018/07/07 Python
基于OpenCV python3实现证件照换背景的方法
2019/03/22 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
python 并发下载器实现方法示例
2019/11/22 Python
Python读取yaml文件的详细教程
2020/07/21 Python
常用的10个Python实用小技巧
2020/08/10 Python
基于Python正确读取资源文件
2020/09/14 Python
Python Selenium异常处理的实例分析
2021/02/28 Python
新电JAVA笔试题目
2014/08/31 面试题
视光学专业毕业生推荐信
2013/10/28 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
学习两会精神心得范文
2014/03/17 职场文书
士力架广告词
2014/03/20 职场文书
派出所副所长四风问题个人整改措施思想汇报
2014/10/13 职场文书