美文网首页
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