Vue組件中的data必須是一個(gè)function的原因淺析
組件可以有自己的data,并且data必須是一個(gè)function。
在下面這個(gè)例子中,data 返回了一個(gè)在外部定義的對(duì)象。并且這個(gè)組件在頁(yè)面中使用了3次,點(diǎn)擊+1時(shí)出現(xiàn)了如下情況:data中的count屬性影響到了所有實(shí)例。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="../css/bootstrap.css" rel="external nofollow" >
<style type="text/css">
#app{
margin:20px;
}
</style>
</head>
<body>
<div id='app'>
<counter></counter>
<counter></counter>
<counter></counter>
</div>
<template id="tmp1">
<div>
<input type="button" value="+1" @click="increment">
<h1>{{count}}</h1>
</div>
</template>
</body>
<script src="../lib/vue.js"></script>
<script>
var dataObj = {count:0}
//這是一個(gè)計(jì)數(shù)器組件,每當(dāng)點(diǎn)擊按鈕,讓data中的count值加1
Vue.component('counter',{
template:'#tmp1',
data:function(){
return dataObj
},
methods:{
increment(){
this.count++
}
}
})
var vm = new Vue({
el:'#app',
})
</script>
</html>
而當(dāng)data選項(xiàng)是一個(gè)函數(shù)的時(shí)候,每個(gè)實(shí)例可以維護(hù)一份被返回對(duì)象的獨(dú)立的拷貝,這樣各個(gè)實(shí)例中的data不會(huì)相互影響,是獨(dú)立的。
Vue.component('counter',{
template:'#tmp1',
data:function(){
return {count:0}
},
methods:{
increment(){
this.count++
}
}
})

補(bǔ)充:下面看下vue組件中data必須是一個(gè)函數(shù)的原因
vue組件中data值不能為對(duì)象,因?yàn)閷?duì)象是引用類型,組件可能會(huì)被多個(gè)實(shí)例同時(shí)引用。如果data值為對(duì)象,將導(dǎo)致多個(gè)實(shí)例共享一個(gè)對(duì)象,其中一個(gè)組件改變data屬性值,其它實(shí)例也會(huì)受到影響。
上面解釋了data不能為對(duì)象的原因,這里我們簡(jiǎn)單說(shuō)下data為函數(shù)的原因。data為函數(shù),通過(guò)return 返回對(duì)象的拷貝,致使每個(gè)實(shí)例都有自己獨(dú)立的對(duì)象,實(shí)例之間可以互不影響的改變data屬性值。
data為函數(shù)的示例:
data:function(){
return {
k1: 'v1',
k2: 'v2',
...
}
}
總結(jié)
以上所述是小編給大家介紹的Vue組件中的data必須是一個(gè)function的原因淺析,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Vue實(shí)現(xiàn)搖一搖功能(兼容ios13.3以上)
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)搖一搖功能,兼容ios13.3以上,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
vue-cli3 取消eslint校驗(yàn)代碼的解決辦法
這篇文章主要介紹了vue-cli3 取消eslint校驗(yàn)代碼的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01
詳解使用jest對(duì)vue項(xiàng)目進(jìn)行單元測(cè)試
這篇文章主要介紹了詳解使用jest對(duì)vue項(xiàng)目進(jìn)行單元測(cè)試,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
vue子組件如何獲取父組件的內(nèi)容(props屬性)
這篇文章主要介紹了vue子組件獲取父組件的內(nèi)容(props屬性),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
Vue3新特性Suspense和Teleport應(yīng)用場(chǎng)景分析
本文介紹了Vue2和Vue3中的Suspense用于處理異步請(qǐng)求的加載提示,以及如何在組件間實(shí)現(xiàn)動(dòng)態(tài)加載,同時(shí),Teleport技術(shù)展示了如何在DOM中靈活地控制組件的渲染位置,解決布局問(wèn)題,感興趣的朋友跟隨小編一起看看吧2024-07-07

