VUE props 实现原理(源码解析)
前言
我们在使用组件的时候,都会给组件传入一些属性,但是在使用时,却只是关注了它传递数据的功能,没有想过它是怎样的一个原理,具体是怎么实现的。
【VUE props 实现原理(源码解析)】其实我们平时写出来的组件,本质上就是一个template
模板,而这个template
模板在vue
中,会通过render
函数解析,最终生成一个VNode
。那我们通过源码来看一下在生成VNode
后,组件属性是怎样实现传递的。
源码解析
生成虚拟节点源码
在生成虚拟节点这,我们可以看到这样一段代码,而这段代码中,propsData
则是所有属性的一个定义,而这个对象的放在了虚拟节点上,那我们可以看看组件初始化时,这个propsData
对象经历了怎么的操作。
const vnode = new VNode(
`vue-component-${Ctor.cid}${name ? `-${name}` : ''}`,
data, undefined, undefined, undefined, context,
{ Ctor, propsData, listeners, tag, children },
asyncFactory
)
组件初始化源码 在下段代码中,我们可以看到
propsData
对象是被赋值到了当前实例上的$options
的propsData
属性中,那我们可以看一下初始化props
时,这个propsData
对象又经过了怎样的一个过程。const opts = vm.$options = Object.create(vm.constructor.options)、
const parentVnode = options._parentVnode
opts._parentVnode = parentVnode
const vnodeComponentOptions = parentVnode.componentOptions
opts.propsData = https://www.it610.com/article/vnodeComponentOptions.propsData
初始化
props
源码
在这里,从$options
拿到$options
对象后,声明了一个叫_props
的空对象。const propsData = https://www.it610.com/article/vm.$options.propsData || {}
const props = vm._props = {}
下面通过
vm.$parent
判断一下是不是根元素,如果是根元素,属性则需要设置为响应式的,如果不是则不需要。const isRoot = !vm.$parent
if (!isRoot) {//如果是根元素属性需要定义成响应式
toggleObserving(false)
}
循环用户定义了的
propsOptions
选项,它会根据用户定义的对象来和用户传入的值通过validateProp
方法来进行一个校验,并且拿到最终的结果value
。然后将当前key和value值,通过
defineReactive
定义到我们前面的_props
中。最终,将
_props
对象定义到我们的实例上去,这样我们就可以通过实例,直接拿取到属性了。 for (const key in propsOptions) {
keys.push(key)//校验用户定义的属性和传入的属性
const value = https://www.it610.com/article/validateProp(key, propsOptions, propsData, vm)
if (process.env.NODE_ENV !=='production') {} else {
defineReactive(props, key, value)
}
if (!(key in vm)) {
proxy(vm, `_props`, key)
}
}
总的来说,就是将父组件传给它的属性,定义到了它自己的实例上了。
推荐阅读
- JavaScript|vue 基于axios封装request接口请求——request.js文件
- vue.js|vue中使用axios封装成request使用
- vue.js组件开发
- 前端开发|Vue2.x API 学习
- javascript|vue使用js-xlsx导出excel,可修改格子样式,例如背景颜色、字体大小、列宽等
- vue.js|后端开发学习Vue(一)
- JS|VUE学习笔记[30-46]
- vue.js|Vue为何弃用经典的Ajax,选择自研Axios()
- vue|vue3替代vuex的框架piniajs实例教程
- cmd配置npm仓库镜像报错