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 XMLHttpRequest对象全面剖析
Apr 24 Javascript
jquery插件之easing 动态菜单
Aug 21 Javascript
页面回到顶部的三种实现(锚标记,js)
Oct 01 Javascript
AngularJS入门教程之学习环境搭建
Dec 06 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
Sep 01 Javascript
微信小程序 弹窗自定义实例代码
Mar 08 Javascript
jquery实现左右轮播切换效果
Jan 01 jQuery
详解Angular-ui-BootStrap组件的解释以及使用
Jul 13 Javascript
微信小程序封装自定义弹窗的实现代码
May 08 Javascript
ssm+vue前后端分离框架整合实现(附源码)
Jul 08 Javascript
JavaScript日期库date-fn.js使用方法解析
Sep 09 Javascript
JavaScript实现显示和隐藏图片
Apr 29 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
session在PHP大型web应用中的使用
2011/06/25 PHP
php防止用户重复提交表单
2015/11/02 PHP
PHP文件操作实例总结
2016/09/27 PHP
php微信开发之图片回复功能
2018/06/14 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
JavaScript 模仿vbs中的 DateAdd() 函数的代码
2007/08/13 Javascript
很酷的javascript loading效果代码
2008/06/18 Javascript
jquery 批量上传图片实现代码
2010/01/28 Javascript
非常有用的40款jQuery 插件推荐(系列二)
2011/12/25 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
Javascript实现商品秒杀倒计时(时间与服务器时间同步)
2015/09/16 Javascript
js如何打印object对象
2015/10/16 Javascript
JS实现的仿淘宝交易倒计时效果
2015/11/27 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
Angularjs单选框相关的示例代码
2017/08/17 Javascript
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
python日志模块logbook使用方法
2019/09/19 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
python实现学生成绩测评系统
2020/06/22 Python
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
婚礼证婚人演讲稿
2014/09/13 职场文书
检查机关党的群众路线个人整改措施
2014/10/04 职场文书
走群众路线剖析材料
2014/10/09 职场文书
销售合作意向书范本
2015/05/08 职场文书
运动会通讯稿600字
2015/07/20 职场文书
高中政治教学反思
2016/02/23 职场文书
员工试用期工作总结
2019/06/20 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis
java项目构建Gradle的使用教程
2022/03/24 Java/Android
el-table-column 内容不自动换行的解决方法
2022/08/14 Vue.js
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
2022/09/23 Servers