Vue組件中data選項爲什麼必須是函數

官方解釋

data 必須是函數
構造 Vue 實例時傳入的各種選項大多數都可以在組件裏使用。只有一個例外:data 必須是函數。實際上,如果你這麼做:

Vue.component('my-component', {
  template: '<span>{{ message }}</span>',
  data: {
    message: 'hello'
  }
})

那麼 Vue 會停止運行,並在控制檯發出警告,告訴你在組件實例中 data 必須是一個函數。但理解這種規則爲何存在也是很有益處的,所以讓我們先作個弊:

<div id="example-2">
  <simple-counter></simple-counter>
  <simple-counter></simple-counter>
  <simple-counter></simple-counter>
</div>
var data = { counter: 0 }
Vue.component('simple-counter', {
  template: '<button v-on:click="counter += 1">{{ counter }}</button>',
  ```
  // 技術上 data 的確是一個函數了,因此 Vue 不會警告,
  // 但是我們卻給每個組件實例返回了同一個對象的引用
  ```
  data: function () {
    return data
  }
})
new Vue({
  el: '#example-2'
})

=============以下爲個人理解,如果有誤,請指出,謝謝指教

Vue.component('xxx',{
template:'{{counter}}',
data:function(){
return counter=0;
}
})

Vue在註冊到全局/局部並生成實例時,它是具有自己的作用域的,也就是說
在template 字符串模板中如果存在一個變量名與VUE實例的變量名一致的時候,這個變量只會是組件中的變量,而不會是VUE的全局變量

比如

//以下代碼中,組件中的count和Vue中的count是一樣的變量名,但是在組件中只會顯示0而不是2
Vue.component('simple-counter',{
                template:'<button>{{count}}</button>',
                data:function(){
                    return count=0;

                }

            });
            vm=new Vue({
                el:'#example-2',
                data:{
                    count:2

                }

            })

以上代碼從原型鏈上理解

var component=function(){}//爲了讓組件有自己的作用域,它必須包含私有變量data,所以簡單化的理解應該是這樣的

var component=function(){
this.data=this.data();//存在私有的data屬性
}

component.propotype.data=function(){
return {count:0}
}
//當我們在template中使用數據的時候,我們是調用的component的私有變量data
//如果我們不以函數的形式處理又會如何呢?
var component=function(){
//不存在私有的data屬性
}
component.propotype.data= {count:0}
//此時,data不作爲私有變量,就會有暴露的風險,而且,它指向的是{count:0}的引用,所以當重複創建組件的時候,component的data都指向了同一個引用。因此會相互影響。

如果不以原型鏈的形式處理,也可以不傳入函數

function component(d) {

                this.data = d;
            }
var com = new component({
                count: 1
            });
            var com1 = new component({
                count: 1
            });             
發佈了108 篇原創文章 · 獲贊 44 · 訪問量 52萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章