vue中向data添加新屬性的三種方式小結(jié)
向data添加新屬性的三種方式
原理分析
首先在了解這三種方式之前,我覺(jué)的有必要說(shuō)一下,為啥不能直接手動(dòng)給data中的對(duì)象添加屬性呢?
下面咱們一塊分析下:
vue2 是通過(guò)數(shù)據(jù)劫持 “Object.defineProperty” 實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式;
? ? const obj = {}; ? ? ? ? let val = 'kk' ? ? ? ? Object.defineProperty(obj,'name',{ ? ? ? ? ? ? get(){ ? ? ? ? ? ? ? ? console.log('訪問(wèn)了') ? ? ? ? ? ? ? ? return val ? ? ? ? ? ? ? ? ? ? ? ? ? ? }, ? ? ? ? ? ? set(newval){ ? ? ? ? ? ? ? ? if(newval !==val) ? ? ? ? ? ? ? ? val = newval; ? ? ? ? ? ? ? ? ?console.log('設(shè)置',newval) ? ? ? ? ? ? } ? ? ? ? })
在我們?cè)L問(wèn)或者設(shè)置obj.name的時(shí)候,會(huì)相繼出發(fā) setter,getter;然而在給obj添加屬性的時(shí)候,卻沒(méi)有觸發(fā)屬性攔截;
其實(shí)上邊的代碼是將obj對(duì)象的name屬性設(shè)置成了響應(yīng)式數(shù)據(jù),但是新添加的屬性并沒(méi)有通過(guò)Object.defineProperty 設(shè)置成響應(yīng)式,所有這就是為什么vue 的data中對(duì)象新加屬性頁(yè)面無(wú)法更新,但是數(shù)據(jù)上卻又我們新加屬性的原因。
三種方式
1.Vue.set()
Vue.set( target, propertyName/index, value ) 參數(shù)
{Object | Array} target
{string | number} propertyName/index
{any} value
返回值:設(shè)置的值
通過(guò)Vue.set向響應(yīng)式對(duì)象中添加一個(gè)property,并確保這個(gè)新 property同樣是響應(yīng)式的,且觸發(fā)視圖更新
data() { ? ? return { ? ? ? ? msg:{ ? ? ? ? ? ? name:'黑澤明', ? ? ? ? ? ? hero:true ? ? ? ? } ? ? ? ? } }, methods: { ? ? addProperty(){ ? ? ? ? this.$set(this.msg, 'sex', '男') ? ? } },
2.Object.assign()
直接使用Object.assign()添加到對(duì)象的新屬性不會(huì)觸發(fā)更新。
應(yīng)創(chuàng)建一個(gè)新的對(duì)象,合并原對(duì)象和混入對(duì)象的屬性
? ? data() { ? ? ? ? return { ? ? ? ? ? ? msg:{ ? ? ? ? ? ? ? ? name:'黑澤明', ? ? ? ? ? ? ? ? hero:true ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? }, ? ?addProperty(){ ? ? ? ? ? ? this.msg = Object.assign({},this.msg,{sex:'name'}); ? ? ? ? },
3.$forceUpdate
$forceUpdate迫使Vue 實(shí)例重新渲染
data() { ? ? return { ? ? ? ? msg:{ ? ? ? ? ? ? name:'黑澤明', ? ? ? ? ? ? hero:true ? ? ? ? } ? ? ? ? } }, addProperty(){ ? ? ? ?this.msg.sex = '男'; ? ? ? ?this.$forceUpdate()? ? ? },
小結(jié)一下吧:
- 對(duì)象中添加少量的新屬性,可以直接采用Vue.set()
- 對(duì)象中添加多個(gè)新屬性,則通過(guò)Object.assign()創(chuàng)建新對(duì)象
- 如果你實(shí)在不知道怎么操作時(shí),可采取$forceUpdate()進(jìn)行強(qiáng)制刷新 (不建議)
vue組件 data等屬性介紹
注意:
1.組件中的data屬性的內(nèi)容,必須是一個(gè)function類型,并且必須要有返回值。用法跟實(shí)例中的data使用是一樣的,同時(shí)也有實(shí)例化對(duì)象的其他屬性如,methods
2.因?yàn)槿绻皇沁@里面的對(duì)象,而是一個(gè)公共的對(duì)象實(shí)例,可能會(huì)出現(xiàn)錯(cuò)誤。不同的組件如果改變了公共的對(duì)象然后返回,對(duì)其他組件有影響
HTML代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <script src="../lib/vue.js"></script> </head> <body> <div id="app"> <my-com></my-com> </div> <script> Vue.component('myCom',{ template:'<h3>陳小帥是真的帥呢 +++ {{ msg }}</h3>', data:function () { return{ msg:'組件中的data內(nèi)容' } } }); //組件中的data屬性的內(nèi)容,必須是一個(gè)function類型,并且必須要有返回值。用法跟實(shí)例中的data使用是一樣的,同時(shí)也有實(shí)例化對(duì)象的其他屬性如,methods //因?yàn)槿绻?,不是這里面的對(duì)象,而是一個(gè)公共的對(duì)象實(shí)例,可能會(huì)出現(xiàn)錯(cuò)誤。不同的組件如果改變了公共的對(duì)象然后返回,對(duì)其他組件有影響 var vm = new Vue({ el:'#app', data:{} }); </script> </body> </html>
效果:
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue封裝遠(yuǎn)程下拉框組件的實(shí)現(xiàn)示例
本文主要介紹了Vue封裝遠(yuǎn)程下拉框組件的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07vue css 引入asstes中的圖片無(wú)法顯示的四種解決方法
這篇文章主要介紹了vue css 引入asstes中的圖片 無(wú)法顯示的幾種解決方案,本文給出了四種解決方法,每種方法給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03解決vue-cli + webpack 新建項(xiàng)目出錯(cuò)的問(wèn)題
下面小編就為大家分享一篇解決vue-cli + webpack 新建項(xiàng)目出錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-03-03如何利用vue實(shí)現(xiàn)css過(guò)渡和動(dòng)畫(huà)
過(guò)渡Vue在插入、更新或者移除 DOM 時(shí),提供多種不同方式的應(yīng)用過(guò)渡效果這篇文章主要給大家介紹了關(guān)于如何利用vue實(shí)現(xiàn)css過(guò)渡和動(dòng)畫(huà)的相關(guān)資料,需要的朋友可以參考下2021-11-11vue中對(duì)象的賦值Object.assign({}, row)方式
這篇文章主要介紹了vue中對(duì)象的賦值Object.assign({}, row)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03vue中的虛擬dom知識(shí)點(diǎn)總結(jié)
這篇文章主要介紹了vue中的虛擬dom知識(shí)點(diǎn)總結(jié),文章圍繞主題內(nèi)容展開(kāi)詳細(xì)介紹,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-04-04vuex state中的數(shù)組變化監(jiān)聽(tīng)實(shí)例
今天小編就為大家分享一篇vuex state中的數(shù)組變化監(jiān)聽(tīng)實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11