为什么vue中data必须是一个函数

2019-08-22  本文已影响0人  xinbo_log

为什么vue中data必须是一个函数

类比引用数据类型

我们注册组件的时候实际上是建立了一个组件构造器的引用,只有使用组件的时候才会真正创建一个组件实例。

  1. 指向同一个对象/属性问题
    function Person () {}
    Person.prototype.data = {
      a:1,
      b:2
    }
    let p1 = new Person();
    let p2 = new Person();
   
    p1.data.a= 'A';
    console.log(p2.data.a); // 'A'
  1. 解决:每一个实例化Vue组件对象下都有一个单独的data方法
    function Person2 () {
        this.data = this.data();
    }
    Person2.prototype.data = function () {
        return {
            a: 1,
            b: 2
        }
    }
    let p4 = new Person2();
    let p5 = new Person2();
    p4.data.a = 'A';
    console.log(p5.data.a); // 1

Vue源码:

    function initData (vm: Component) {
      let data = vm.$options.data 
      data = vm._data = typeof data === 'function' ? getData(data, vm): data || {}
    }
    export function getData (data: Function, vm: Component): any {
      pushTarget()
      try {
        return data.call(vm, vm)
      } catch (e) {
        handleError(e, vm, `data()`)
        return {}
      } finally {
        popTarget()
      }
    }
上一篇 下一篇

猜你喜欢

热点阅读