Vue例項裡面的data屬性為什麼用函式返回

2022-01-19 16:57:11 字數 2127 閱讀 5857

最近在學習vue中在圖靈社群買了一本電子書《vue小書》,我感覺挺坑的,沒有期待的那麼好。

其中有的一下子就給一大串**,但這一大串**只是為了說明某一點,但是這片**很多處都可以講的,大概是因為篇幅限制原因吧。

首先官方解釋:

當乙個元件被定義, data 必須宣告為返回乙個初始資料物件的函式,因為元件可能被用來建立多個例項。如果 data 仍然是乙個純粹的物件,則所有的例項將共享引用同乙個資料物件!通過提供 data 函式,每次建立乙個新例項後,我們能夠呼叫 data 函式,從而返回初始資料的乙個全新副本資料物件。然後又舉了乙個例子:

假定存在元件componenta,裡面定義為

module.exports = ,

data:

}在某個page裡面我們定義了如下的模板

那麼上面兩個componenta的例項中的data將同時為元件定義時data對應的物件,即相當於兩個例項的data相互影響了。

也就是第乙個例項的data和第二個我們並不想改變的例項的data也會發生改變。

再舉個例子:

點選的次數}

點選的次數}

執行上面兩段**會發現不同結果。

這個問題模擬到引用資料型別。

如果不用function return 每個元件的data都是記憶體的同乙個位址,那乙個資料改變其他也改變了,這當然就不是我們想要的。

用function return 其實就相當於申明了新的變數,相互獨立,自然就不會有這樣的問題

這讓我之前看到的乙個js指標問題,js裡面有引用型別和基本型別,

//基本型別

var a = 1;

var b = a;

b = 2;

console.log(a) //1 值不隨b的改變而改變

//引用型別

var a = ;

var b = a;

b.x = 2

console.log(a.x) //2 值隨著b的改變而改變

具體原因,犀牛書裡面好像講過, 基本型別占用空間少,而引用型別占用大,js為了節約空間,就把引用型別的值用乙個叫做指標的東西和變數連線起來, 也就是說改乙個其他的都會跟著改變,公用的意思.

我們用js原型鏈在舉乙個例子:

var mycomponent = function() {}

mycomponent.prototype.data =

// 上面是乙個虛擬的元件構造器,真實的元件構造器方法很多

var component1 = new mycomponent()

var component2 = new mycomponent()

// 上面例項化出來兩個元件例項,也就是通過呼叫,建立的兩個例項

component1.data.a === component2.data.a // true

component1.data.b = 5

component2.data.b // 5

可以看到上面**中最後三句測試**,如果兩個例項同時引用乙個物件,那麼當你修改其中乙個屬性的時候,另外乙個例項也會跟著改。這怎麼可以,兩個例項應該有自己各自的域才對。所以,需要通過下面方法來進行處理:

var mycomponent = function() 

mycomponent.prototype.data = function()

}

這個方法就是給例項新增乙個data屬性,它的值是原型方法data返回的乙個新物件,下次用例項訪問data的時候就會直接訪問到這個物件,因為有了例項屬性data了,就不會去查詢原型上的data。

vue.component('my-component',  // 返回乙個唯一的物件,不要和其他元件共用乙個物件進行返回

},})

上面這個操作是乙個簡易操作,實際上,它首先需要建立乙個元件構造器,然後註冊元件。註冊元件的本質其實就是建立乙個元件構造器的引用。使用元件才是真正建立乙個元件例項。所以,註冊元件其實並不產生新的元件類,但會產生乙個可以用來例項化的新方式。

關於data裡面的資料使用注意

需要注意的問題 記得在this.setdata 外使用時要加this.data.單單使用this.data.xx修改資料後不會在wxml更新的,還要使用this.setdata設定一遍才行 如var that this that.data.flag true 僅僅這樣寫是不會在wxml更新的以下兩種...

Vue裡面的 emit與 on

學習vue看到了裡面的 emit,有乙個疑問冒出來 emit必須和 on一起使用嗎?在我看來雖然沒有說是必須一起使用,但基本上都是搭配在一起出現,因為 emit的作用是子元件對父元件傳送資料,on可以接收到子元件返回的資料,所以有 emit的地方應該就有 on了,我是這樣理解的。emit 的引數ev...

Vue重置當前頁面的data

在某些情況下,需要重新使用data中的資料,但是data中的資料已經被各種表單 變數等賦值,那麼怎麼重置data的值呢?js相關函式函式 含義object.assign target,sources 將所有可列舉屬性值從乙個或多個源物件複製到目標物件 vue中相關函式函式 含義this.data 當...