前言:
而今各位老铁们对“js页面初始化函数”大约比较珍视,看官们都想要剖析一些“js页面初始化函数”的相关文章。那么小编在网上收集了一些对于“js页面初始化函数””的相关内容,希望兄弟们能喜欢,咱们一起来学习一下吧!首先我们打开'src/core/instance/inject.js'文件,代码如下:
function initProps (vm: Component, propsOptions: Object) { const propsData = vm.$options.propsData || {} const props = vm._props = {} const keys = vm.$options._propKeys = [] const isRoot = !vm.$parent // root instance props should be converted if (!isRoot) { toggleObserving(false) } for (const key in propsOptions) { keys.push(key) const value = validateProp(key, propsOptions, propsData, vm) /* istanbul ignore else */ if (process.env.NODE_ENV !== 'production') { const hyphenatedKey = hyphenate(key) if (isReservedAttribute(hyphenatedKey) || config.isReservedAttr(hyphenatedKey)) { warn( `"${hyphenatedKey}" is a reserved attribute and cannot be used as component prop.`, vm ) } defineReactive(props, key, value, () => { if (!isRoot && !isUpdatingChildComponent) { warn( `Avoid mutating a prop directly since the value will be ` + `overwritten whenever the parent component re-renders. ` + `Instead, use a data or computed property based on the prop's ` + `value. Prop being mutated: "${key}"`, vm ) } }) } else { defineReactive(props, key, value) } if (!(key in vm)) { proxy(vm, `_props`, key) } } toggleObserving(true)}
我们接下来给他拆分一下这个函数,别看这个函数代码很多,其实功能很简单。
const isRoot = !vm.$parent // root instance props should be converted if (!isRoot) { toggleObserving(false) }
isRoot变量的取值来自是否存在父级 "$parent",如果不是根实例 "Root",那就禁用组件的更新计算。
const value = validateProp(key, propsOptions, propsData, vm)
验证 "props" 对象,关于 "validateProp" 函数的具体分析,我们用会单独的篇章来分析。
const hyphenatedKey = hyphenate(key)
hyphenate函数的主要功能就是匹配到连字符的时候,在中间加一个 "-" 连接符。
例如:
“AGEold”字符串转换成 “A-G-Eold”
if (isReservedAttribute(hyphenatedKey) || config.isReservedAttr(hyphenatedKey)) { warn( `"${hyphenatedKey}" is a reserved attribute and cannot be used as component prop.`, vm ) }
此处是验证 "hyphenatedKey" 是否为保留属性,否则会有 "warn" 警告提示,具体的保留属性有如下:
“is”、“key”、“ref”、“slot”、“slot-scope”、“class”、“style”
接下来就是调用 "defineReactive" 函数对属性的操作进行拦截,关于 "defineReactive"的具体分析,我们有专门的篇章来讲解。
if (!(key in vm)) { proxy(vm, `_props`, key) }
proxy函数的内部就是采用 "Object.defineProperty" 对 "key" 属性操作进行拦截。
toggleObserving(true)
最后就是恢复组件的更新计算操作。
标签: #js页面初始化函数