你知道vue data為什么是一個函數(shù)
官網(wǎng)解釋:當(dāng)一個組件被定義,data 必須聲明為返回一個初始數(shù)據(jù)對象的函數(shù),因為組件可能被用來創(chuàng)建多個實例。如果 data 仍然是一個純粹的對象,則所有的實例將共享引用同一個數(shù)據(jù)對象!通過提供 data 函數(shù),每次創(chuàng)建一個新實例后,我們能夠調(diào)用 data 函數(shù),從而返回初始數(shù)據(jù)的一個全新副本數(shù)據(jù)對象。我看到這個問題的時候是我面試的時候一個面試官問我的,當(dāng)時懵了,從來沒有想過為什么,只知道代碼需要這么寫。最近有空再來了解一下這部分的原理內(nèi)容。有兩個我比較喜歡回答
1.是為了在重復(fù)創(chuàng)建實例的時候避免共享同一數(shù)據(jù)造成的數(shù)據(jù)污染
2.寫函數(shù)的原因是為了保證這個對象是獨立的,如果可以保證對象是惟一的,也可以不寫函數(shù)直接寫對象。
其實歸根結(jié)底就是為了避免數(shù)據(jù)污染。
我們想要解決這個問題就不得不說原型鏈和this。
相關(guān)知識可以自行去了解。在原型鏈中對象共享公共的屬性和方法。
person1和person2是Person的引用,所以當(dāng)person2改變數(shù)據(jù)是實際上更改的是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到底指向誰,實際上this指向調(diào)用它的對象。又有一個疑問了,明明指向的是同一個方法為什么會有不一樣的呢?難道克隆了一個?答案:定義在構(gòu)造函數(shù)內(nèi)部的方法,會在它的每一個實例上都克隆這個方法;定義在構(gòu)造函數(shù)的prototype
屬性上的方法會讓它的所有示例都共享這個方法,但是不會在每個實例的內(nèi)部重新定義這個方法引用:http://www.dbjr.com.cn/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直接定義成一個對象則會報錯
3.定義一個外部對象的形式,結(jié)果點擊一個按鈕,兩個數(shù)據(jù)同時增加,造成數(shù)據(jù)污染
到此這篇關(guān)于vue data為什么是一個函數(shù)?的文章就介紹到這了,更多相關(guān)vue data 函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue3+echarts+折線投影(陰影)效果的實現(xiàn)
這篇文章主要介紹了vue3+echarts+折線投影(陰影)效果的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10詳解Vue+ElementUI從零開始搭建自己的網(wǎng)站(一、環(huán)境搭建)
這篇文章主要介紹了Vue+ElementUI從零開始搭建自己的網(wǎng)站(一、環(huán)境搭建),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04表格Table實現(xiàn)前端全選所有功能方案示例(包含非當(dāng)前頁)
這篇文章主要為大家介紹了表格Table實現(xiàn)前端全選所有功能,包括非當(dāng)前頁的方案示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-02-02