你知道vue data為什么是一個函數(shù)
官網(wǎng)解釋:當(dāng)一個組件被定義,data 必須聲明為返回一個初始數(shù)據(jù)對象的函數(shù),因?yàn)榻M件可能被用來創(chuàng)建多個實(shí)例。如果 data 仍然是一個純粹的對象,則所有的實(shí)例將共享引用同一個數(shù)據(jù)對象!通過提供 data 函數(shù),每次創(chuàng)建一個新實(shí)例后,我們能夠調(diào)用 data 函數(shù),從而返回初始數(shù)據(jù)的一個全新副本數(shù)據(jù)對象。我看到這個問題的時候是我面試的時候一個面試官問我的,當(dāng)時懵了,從來沒有想過為什么,只知道代碼需要這么寫。最近有空再來了解一下這部分的原理內(nèi)容。有兩個我比較喜歡回答
1.是為了在重復(fù)創(chuàng)建實(shí)例的時候避免共享同一數(shù)據(jù)造成的數(shù)據(jù)污染
2.寫函數(shù)的原因是為了保證這個對象是獨(dú)立的,如果可以保證對象是惟一的,也可以不寫函數(shù)直接寫對象。
其實(shí)歸根結(jié)底就是為了避免數(shù)據(jù)污染。
我們想要解決這個問題就不得不說原型鏈和this。
相關(guān)知識可以自行去了解。在原型鏈中對象共享公共的屬性和方法。

person1和person2是Person的引用,所以當(dāng)person2改變數(shù)據(jù)是實(shí)際上更改的是Person的的數(shù)據(jù)。既然Person的數(shù)據(jù)改變了,所以Person的引用person1也會被改變
function Person(){
}
Person.prototype.datas={
a:"c",
f:'h'
}
var person1 = new Person()
var person2 = new Person()
person2.datas.a="wewew"
console.log(person2)
console.log(person1)

我之前一直有一個疑問既然person1和person2都是Person的引用為什么放在對象里面會造成數(shù)據(jù)污染但是放在方法里就不會造成數(shù)據(jù)污染了呢?首先要知道一句話:this的指向在函數(shù)定義的時候是確定不了的,只有在函數(shù)執(zhí)行的時候才能確定this到底指向誰,實(shí)際上this指向調(diào)用它的對象。又有一個疑問了,明明指向的是同一個方法為什么會有不一樣的呢?難道克隆了一個?答案:定義在構(gòu)造函數(shù)內(nèi)部的方法,會在它的每一個實(shí)例上都克隆這個方法;定義在構(gòu)造函數(shù)的prototype屬性上的方法會讓它的所有示例都共享這個方法,但是不會在每個實(shí)例的內(nèi)部重新定義這個方法引用:http://www.dhdzp.com/article/199830.htm
function Person(){
this.datas = this.sayHello()//this指向調(diào)用它的對象
}
Person.prototype.sayHello = function () {
return{
d:1,
b:2
}
};
var person1 = new Person()
var person2 = new Person()
person2.datas.d="wewew"
console.log(person1)
console.log(person2)

具體例子如下
1.正常狀態(tài) 當(dāng)使用data函數(shù)的時候沒有造成數(shù)據(jù)污染
<em id="__mceDel">ButtonTest.vue<br><template>
<div>
<div>{{ count }}</div>
<button @click="onAdd">增加</button>
</div>
</template>
<script>
export default {
data() {
return {
count: 0,
};
},
methods: {
onAdd() {
this.count++;
},
},
};
</script><br></em>
Home.vue
<template>
<div class="home">
<button-test></button-test>
<button-test></button-test>
</div>
</template>
<script>
import ButtonTest from "@/components/ButtonTest.vue";
export default {
name: "Home",
components: {
ButtonTest,
},
};
</script>

2.若data直接定義成一個對象則會報(bào)錯


3.定義一個外部對象的形式,結(jié)果點(diǎn)擊一個按鈕,兩個數(shù)據(jù)同時增加,造成數(shù)據(jù)污染


到此這篇關(guān)于vue data為什么是一個函數(shù)?的文章就介紹到這了,更多相關(guān)vue data 函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue項(xiàng)目中,main.js,App.vue,index.html的調(diào)用方法
今天小編就為大家分享一篇vue項(xiàng)目中,main.js,App.vue,index.html的調(diào)用方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09
vue2項(xiàng)目增加eslint配置代碼規(guī)范示例
這篇文章主要為大家介紹了vue2項(xiàng)目增加eslint配置代碼規(guī)范示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
vue 項(xiàng)目集成 electron 和 electron 打包及環(huán)境配
文章介紹了如何使用Vue和Electron開發(fā)桌面端應(yīng)用,包括安裝Electron、配置package.json、創(chuàng)建main.js文件、運(yùn)行和打包應(yīng)用等步驟,并分享了一些常見的打包錯誤及其解決方法,感興趣的朋友一起看看吧2025-01-01
在vue中根據(jù)光標(biāo)的顯示與消失實(shí)現(xiàn)下拉列表
這篇文章主要介紹了在vue中根據(jù)光標(biāo)的顯示與消失實(shí)現(xiàn)下拉列表,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09

