龙空技术网

Vue源码逐行解析十二 initProps函数(初始化props选项数据)

小小的码农 120

前言:

而今各位老铁们对“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页面初始化函数