十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
這篇文章給大家介紹Vue2.0中怎么實現(xiàn)數(shù)據(jù)的雙向綁定,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

實現(xiàn)組件雙向數(shù)據(jù)綁定
在上一節(jié)中最后的示例使用的是Vue 1.0版本中的 .sync 實現(xiàn)數(shù)據(jù)雙向綁定。那我們先來看看拋棄 .sync 修飾符來實現(xiàn)組件雙向數(shù)據(jù)綁定的工作: 通過Vue提供的機制,繞開直接修改 prop 來實現(xiàn)組件雙向數(shù)據(jù)綁定 。
其思路大致是這樣:
在數(shù)據(jù)渲染時使用 prop 渲染數(shù)據(jù)
將 prop 綁定到子組件自身的數(shù)據(jù)上,修改數(shù)據(jù)時修改自身數(shù)據(jù)來替代 prop
watch 子組件自身數(shù)據(jù)的改變,觸發(fā)事件通知父組件更改綁定到 prop 的數(shù)據(jù)
這樣做的好處是: 父組件數(shù)據(jù)改變時,不會修改存儲 prop 的子組件數(shù)據(jù),只是以子組件數(shù)據(jù)為媒介,完成對 prop 的雙向修改 。
繼續(xù)拿上一節(jié)的示例來舉例,只不過接下來的示例,并沒有使用 .sync 來實現(xiàn)雙向數(shù)據(jù)綁定的效果。
修改的代碼如下:
父組件Parent數(shù)據(jù)
- {{ name }}
- {{ age }}
name = val" @update:my-age="val => age = val"> 子組件child數(shù)據(jù)
- {{ myName }}
- {{ myAge }}
在上面的這個示例中,我們并沒有使用 .sync 修飾符,但在調用子組件的時候使用了 @update :
name = val" @update:my-age="val => age = val">
子組件中渲染到HTML模板的數(shù)據(jù)是用的 prop 數(shù)據(jù),但監(jiān)聽 input 是使用的子組件自身定義的數(shù)據(jù)作為 v-model 。這樣一來就不會直接修改 prop 。簡單來說, 一切 prop 的改變從本質上來說都由父組件完成 。JavaScript的代碼如下:
let parent = new Vue({
el: '#app',
data () {
return {
name: 'w3cplus',
age: 7
}
},
components: {
'child': {
template: '#child',
props: ['myName', 'myAge'],
data () {
return {
childMyName: this.myName,
childMyAge: this.myAge
}
},
watch: {
childMyName: function (val) {
this.$emit('update:my-name', val)
},
childMyAge: function (val) {
this.$emit('update:my-age', val)
}
}
}
}
})最終效果如下:
上面的示例效果,不管是修改父組件的數(shù)據(jù)還是子組件的數(shù)據(jù),都會相互影響:
因為子組件中 props 的 myName 和 myAge 不可寫,所以在 data 中創(chuàng)建一個副本 childMyName 和 childMyAge 。初始值為 props 屬性 myName 和 myAge 的值,同時在組件內所有需要調用 props 的地方調用 data 中的 childMyName 和 childMyAge 。
components: {
'child': {
template: '#child',
props: ['myName', 'myAge'],
data () {
return {
childMyName: this.myName,
childMyAge: this.myAge
}
},
...
}
}接下來在子組件中通過 watch 來對 props 屬性的 myName 和 myAge 進行監(jiān)聽。當 props 修改后對應 data 中的副本 childMyName 和 childMyAge 也要同步數(shù)據(jù)。
...
watch: {
childMyName: function (val) {
this.$emit('update:my-name', val)
},
childMyAge: function (val) {
this.$emit('update:my-age', val)
}
}
...接下來要做的事情就是當組件內的 props 屬性發(fā)生變化時,需要向組件外(父組件)發(fā)送通知,通知組件內屬性變更,然后由外層(父組件)自己來決定是否變更他的數(shù)據(jù)。
接下來我們按上面的方案來改造上一節(jié)示例中的switch按鈕。
至此,實現(xiàn)了組件內部數(shù)據(jù)與組件外部的數(shù)據(jù)的雙向綁定,組件內外數(shù)據(jù)的同步。簡而言之: 組件內部自已變了告訴外部,外部決定要不要變更 。
什么樣的 props 適合做雙向綁定
事實上,在Vue中,雙向綁定的 props 是不利于組件間的數(shù)據(jù)狀態(tài)管理,尤其是較為復雜的業(yè)務當中,因此在實際項目中應該盡量少用雙向綁定,過于復雜的數(shù)據(jù)處理,建議使用 Vuex 。但很多時候又避免不了使用雙向綁定。那么什么場景之下使用 props 來做雙向綁定呢?
如果在你的項目中,同時滿足下面的條件時,我們就可以考慮使用 props 來做雙向綁定:
組件內部需要修改 props
組件需要可以由外部在運行時動態(tài)控制,而非單純的初始化
組件父部需要讀取組件內的狀態(tài)來進行處理
雖然上面的示例展示了我們怎么在Vue 2.0中實現(xiàn) props 的雙向綁定,但如果項目中有更多這樣的雙向綁定,那么就會讓你做一些重復的事情,而且代碼也很冗余,事情也會變得復雜。為了改變這樣的現(xiàn)象,可以借助Vue的 mixin 來自動化處理 props 的雙向綁定的需求。不過在這節(jié)中,我們不會學習這方面的知識,后面我們在學習 mixin 時,可地再回過頭來實現(xiàn)這樣的功能。
關于Vue2.0中怎么實現(xiàn)數(shù)據(jù)的雙向綁定就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。