Vueコンポーネントのdataはなぜ関数でなければならないのですか?

1313 ワード

実はこれはvue自体の設計とは関係なくjs自体の特性によるものです.
jsのプロトタイプチェーン:
var MyComponent = function() {}
MyComponent.prototype.data = {
  a: 1,
  b: 2,
}

上は仮想コンポーネントコンストラクタで、実際のコンポーネントコンストラクタの方法はたくさんあります.
var component1 = new MyComponent()
var component2 = new MyComponent()

2つのコンポーネントインスタンス、すなわち呼び出しによって作成された2つのインスタンスをインスタンス化します.
component1.data.a === component2.data.a // true
component1.data.b = 5
component2.data.b // 5

上のコードの最後の3つの文が表示されます.これはお父さんです.2つのインスタンスが同時に1つのオブジェクトを参照すると、1つのプロパティを変更すると、別のインスタンスも変更されます.これはどうしてできますか.2つのインスタンスにはそれぞれのドメインがあるはずです.そのため、以下の方法で処理する必要があります.
var MyComponent = function() {
  this.data = this.data()
}
MyComponent.prototype.data = function() {
  return {
    a: 1,
    b: 2,
  }
}

これにより、各インスタンスのdataプロパティは独立しており、相互に影響しません.だから、vueコンポーネントのdataが関数でなければならない理由を知っていますよね.