Vue Computed中g(shù)et和set的用法及Computed與watch的區(qū)別
vue的computed方法
vue.js的computed方法
計(jì)算屬性是基于它們的依賴進(jìn)行緩存的,只在相關(guān)依賴發(fā)生改變時(shí)它們才會(huì)重新求值。
用 methods 也可以實(shí)現(xiàn)同樣的效果,但 methods 在重新渲染的時(shí)候會(huì)重新調(diào)用執(zhí)行,在性能上 computed 優(yōu)于 methods,當(dāng)不需要緩存時(shí)可用 methods。
computed回調(diào)函數(shù)域中的回調(diào)函數(shù)方法可以在插值表達(dá)式{{}}中直接獲取返回結(jié)果而無(wú)需在data數(shù)據(jù)域中定義相關(guān)的屬性,這一點(diǎn)相較于watch中而言使用起來(lái)也更方便些。
get
一般情況下,我們只是使用了computer中的gettter屬性,默認(rèn)只有 getter,我們只是單純的使用了gettter屬性。
set
只有當(dāng)computed監(jiān)測(cè)的值變化的時(shí)候,set才回被調(diào)用。
computed中g(shù)et和set的栗子(引用官網(wǎng))
var vm = new Vue({
data: { a: 1 },
computed: {
// 僅讀取
aDouble: function () {
return this.a * 2
},
// 讀取和設(shè)置
aPlus: {
// 頁(yè)面初始化時(shí)會(huì)先執(zhí)行一次 get 好比與computed的getter屬性
// 監(jiān)視 data 中 a 的屬性值,只有發(fā)生改變時(shí),它們才會(huì)重新求值,否則取緩存中的
get: function () {
console.log('調(diào)用了getter屬性')
return this.a + 1
},
// 監(jiān)視當(dāng)前屬性值的變化,當(dāng)屬性值發(fā)生變化時(shí)執(zhí)行,
// 更新相關(guān)的屬性數(shù)據(jù),類似于 watch 的功能
set: function (newValue) {
console.log('調(diào)用了settter屬性')
console.log(newValue,'newValue');
this.a = newValue - 1
}
}
}
})
vm.aPlus // => 2
console.log(vm.aPlus,'第一次執(zhí)行的vm.aPlus');
// DOM 還沒(méi)更新
console.log(vm.a,'第一次vm.a');
// 當(dāng)監(jiān)聽(tīng)到值變化時(shí) 執(zhí)行set
vm.aPlus = 4
console.log(vm.aPlus,'第二次執(zhí)行的vm.aPlus');
console.log(vm.a,'第二次vm.a');
// vm.$nextTick方法 將回調(diào)延遲到下次 DOM 更新循環(huán)之后執(zhí)行。
// 在修改數(shù)據(jù)之后立即使用它,然后等待 DOM 更新。
// 它跟全局方法 Vue.nextTick 一樣,不同的是回調(diào)的this自動(dòng)綁定到調(diào)用它的實(shí)例上。
vm.$nextTick(function () {
// DOM 現(xiàn)在更新了
console.log(vm.a,'this.vm.a');
})
// 更新后data中a為3
vm.aDouble // => 6
console.log(vm.a,'vm.aDouble中的a',vm.aDouble,'vm.aDouble');可以看打印結(jié)果

watch 方法
1.通過(guò) watch 監(jiān)聽(tīng) data 數(shù)據(jù)的變化,數(shù)據(jù)發(fā)生變化時(shí),就會(huì)打印當(dāng)前的值
watch: {
data(val, value) {
console.log(val)
console.log(value)
}
}2.通過(guò) watch 監(jiān)聽(tīng) list 數(shù)據(jù)的變化,數(shù)據(jù)發(fā)生變化時(shí),this.number++(使用深度監(jiān)聽(tīng))
data() {
return {
list: {
'id': 1,
'type': 0
},
number: 0
}
},
watch: {
list: {
handler(newVal) {
this.number++
},
deep: true
}
}3. 通過(guò) watch 監(jiān)聽(tīng) data 數(shù)據(jù)的變化,數(shù)據(jù)發(fā)生變化時(shí),執(zhí)行 change 方法
watch: {
data: 'change' // 值可以為methods的方法名
},
methods: {
change(curVal,oldVal){
console.log(curVal,oldVal)
}
}watch中的immediate、handler和deep屬性
1. immediate 和 handler
這樣使用watch時(shí)有一個(gè)特點(diǎn),就是當(dāng)值第一次綁定時(shí),不會(huì)執(zhí)行監(jiān)聽(tīng)函數(shù),只有值發(fā)生改變時(shí)才會(huì)執(zhí)行。如果我們需要在最初綁定值的時(shí)候也執(zhí)行函數(shù),則就需要用到immediate屬性。
data() {
return {
list: {
'id': 1,
'type': 0
},
number: 0
}
},
watch: {
list: {
handler(newVal) {
this.number++
},
immediate: true
}
}2. deep
當(dāng)需要監(jiān)聽(tīng)一個(gè)對(duì)象的改變時(shí),普通的watch方法無(wú)法監(jiān)聽(tīng)到對(duì)象內(nèi)部屬性的改變,此時(shí)就需要deep屬性對(duì)對(duì)象進(jìn)行深度監(jiān)聽(tīng)。
data() {
return {
list: {
'id': 1,
'type': 0
},
number: 0
}
},
watch: {
list: {
handler(newVal) {
this.number++
},
deep: true
}
}設(shè)置deep:true則可以監(jiān)聽(tīng)到 list.id 的變化,此時(shí)會(huì)給 list 的所有屬性都加上這個(gè)監(jiān)聽(tīng)器,當(dāng)對(duì)象屬性較多時(shí),每個(gè)屬性值的變化都會(huì)執(zhí)行 handler。
如果只需要監(jiān)聽(tīng)對(duì)象中的一個(gè)屬性值,則可以做以下優(yōu)化:使用字符串的形式監(jiān)聽(tīng)對(duì)象屬性:
data() {
return {
list: {
'id': 1,
'type': 0
}
}
},
watch: {
'list.id': {
handler(newVal, oldVal) {
......
},
deep: true
}
}結(jié)論:數(shù)組(一維、多維)的變化不需要通過(guò)深度監(jiān)聽(tīng),對(duì)象數(shù)組中對(duì)象的屬性變化則需要deep深度監(jiān)聽(tīng)。
computed與watch的區(qū)別
computed與watch的不同點(diǎn)
觸發(fā)條件不同
- computed計(jì)算屬性會(huì)依賴于使用它的data屬性,只要是依賴的data屬性值有變動(dòng),則自定義重新調(diào)用計(jì)算屬性執(zhí)行一次。
- watch則是在監(jiān)控的data屬性值發(fā)生變動(dòng)時(shí),其會(huì)自動(dòng)調(diào)用watch回調(diào)函數(shù)。
執(zhí)行速度不同
- computed計(jì)算屬性的值是直接從緩存中獲取,而不是重新編譯執(zhí)行一次,因而其性能要高一些,尤其是在data屬性中的值無(wú)變化,而重復(fù)調(diào)用computed回調(diào)函數(shù)時(shí)更是如此,所以說(shuō)在Vue中,應(yīng)該盡可能的多使用computed替代watch。
- watch中的值需要data屬性重新編譯執(zhí)行,因而其性能方面會(huì)有所損失。
使用方式不同
- computed計(jì)算屬性的回調(diào)函數(shù)方法可以直接在頁(yè)面中通過(guò)插值表達(dá)式——{{}}來(lái)獲取。此時(shí)我們不需要再data數(shù)據(jù)域中再定義一個(gè)與方法名相同的屬性。
- watch中的方法名必須是data數(shù)據(jù)域中所存在的,否則無(wú)法使用。
相同點(diǎn)
都可以實(shí)現(xiàn)通過(guò)監(jiān)控data數(shù)據(jù)域中屬性值的變化來(lái)觸發(fā)相應(yīng)的回調(diào)函數(shù),進(jìn)而實(shí)現(xiàn)我們特殊的邏輯業(yè)務(wù)處理功能。
項(xiàng)目中的使用總結(jié)
1.在methods中,對(duì)于data中在視圖中需要的任一個(gè)數(shù)據(jù)發(fā)生變化,都會(huì)重新更新視圖,不會(huì)緩存數(shù)據(jù)。
2.在computed中,計(jì)算過(guò)后會(huì)有緩存結(jié)果,下次調(diào)用時(shí)候,直接取緩存的結(jié)果,除非所依賴的響應(yīng)式數(shù)據(jù)發(fā)生變化才會(huì)再次執(zhí)行,計(jì)算內(nèi)部一定有return。(在用的時(shí)候直接寫函數(shù)名字)
當(dāng)一個(gè)屬性受多個(gè)屬性影響的時(shí)候就需要用到computed 最典型的栗子:購(gòu)物車商品結(jié)算的時(shí)候
3.監(jiān)聽(tīng)指定的響應(yīng)式數(shù)據(jù)發(fā)生變化,如果有變化會(huì)重新調(diào)用。
當(dāng)一條數(shù)據(jù)影響多條數(shù)據(jù)的時(shí)候就需要用watch 栗子:搜索數(shù)據(jù)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vant中field組件label屬性兩端對(duì)齊問(wèn)題及解決
這篇文章主要介紹了vant中field組件label屬性兩端對(duì)齊問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
關(guān)于vue?src路徑動(dòng)態(tài)拼接的小知識(shí)
這篇文章主要介紹了vue?src路徑動(dòng)態(tài)拼接的小知識(shí),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。2022-04-04
使用Webpack提升Vue.js應(yīng)用程序的4種方法(翻譯)
這篇文章主要介紹了使用Webpack提升Vue.js應(yīng)用程序的4種方法(翻譯),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10
Vue請(qǐng)求后端接口導(dǎo)出excel表格方式
這篇文章主要介紹了Vue請(qǐng)求后端接口導(dǎo)出excel表格方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
vue 解決數(shù)組賦值無(wú)法渲染在頁(yè)面的問(wèn)題
今天小編就為大家分享一篇vue 解決數(shù)組賦值無(wú)法渲染在頁(yè)面的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
Vue首屏性能優(yōu)化組件知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家整理了一篇關(guān)于Vue首屏性能優(yōu)化組件知識(shí)點(diǎn)總結(jié),有需要的朋友們可以跟著學(xué)習(xí)下。2021-11-11

