美文网首页
vue源码分析(十)核心函数之initData

vue源码分析(十)核心函数之initData

作者: vue爱好者 | 来源:发表于2020-04-21 20:50 被阅读0次

我们打开文件 src/core/instance/state.js,找到定义initData函数的代码:

function initData (vm: Component) {
  let data = vm.$options.data
  data = vm._data = typeof data === 'function'
    ? getData(data, vm)
    : data || {}
  if (!isPlainObject(data)) {
    data = {}
    process.env.NODE_ENV !== 'production' && warn(
      'data functions should return an object:\n' +
      'https://vuejs.org/v2/guide/components.html#data-Must-Be-a-Function',
      vm
    )
  }
  // proxy data on instance
  const keys = Object.keys(data)
  const props = vm.$options.props
  const methods = vm.$options.methods
  let i = keys.length
  while (i--) {
    const key = keys[i]
    if (process.env.NODE_ENV !== 'production') {
      if (methods && hasOwn(methods, key)) {
        warn(
          `Method "${key}" has already been defined as a data property.`,
          vm
        )
      }
    }
    if (props && hasOwn(props, key)) {
      process.env.NODE_ENV !== 'production' && warn(
        `The data property "${key}" is already declared as a prop. ` +
        `Use prop default value instead.`,
        vm
      )
    } else if (!isReserved(key)) {
      proxy(vm, `_data`, key)
    }
  }
  // observe data
  observe(data, true /* asRootData */)
}

首先判断 data 是否是函数,如果是函数就调用 getData 进行处理。
然后调用 isPlainObject 方法判断是否是对象,如果不是对象将对 data赋值一个空对象,然后抛出一个 warn
紧接着对 data的每个对象进行遍历,对每个方法进行了3层判断。

1、不能和 Method 重名。
2、不能和 props 重名。
3、不能用下划线_和美元符号$开头。

最后调用 observe 对数据进行监听,具体的 Observe 函数的分析,请点击查看。

相关文章

网友评论

      本文标题:vue源码分析(十)核心函数之initData

      本文链接:https://www.haomeiwen.com/subject/ryekyhtx.html