Vue computed與watch用法區(qū)分
computed用法
- 響應(yīng)式緩存
- 每一個(gè)計(jì)算屬性都會(huì)被緩存起來,只要計(jì)算屬性所依賴的屬性發(fā)生變化,計(jì)算屬性就會(huì)重新執(zhí)行,視圖也會(huì)更新
- computed方法里面的屬性不能在Date中定義
- .具有緩存性,頁面重新渲染值不變化,,計(jì)算屬性會(huì)立即返回之前的計(jì)算結(jié)果,而不必再次執(zhí)行函數(shù)
data: {
firstName: 'one',
lastName: 'two'
},
//計(jì)算方法
computed: {
allname:{
//回調(diào)函數(shù) 當(dāng)需要讀取當(dāng)前屬性值是執(zhí)行,根據(jù)相關(guān)數(shù)據(jù)計(jì)算并返回當(dāng)前屬性的值
get() {//
return this.firstName + ' ' + this.lastName
},
//監(jiān)視當(dāng)前屬性值的變化,當(dāng)屬性值發(fā)生變化時(shí)執(zhí)行,更新相關(guān)的屬性數(shù)據(jù)
set(val){
const names = val.split(' ');
this.firstName = names[0];
this.lastName = names[1];
}
}
},
watch用法
- 需要在數(shù)據(jù)變化時(shí)執(zhí)行異步或開銷較大的操作時(shí),這個(gè)方式是最有用的
- 應(yīng)用:監(jiān)聽props,$emit或本組件的值執(zhí)行異步操作
- 無緩存性,頁面重新渲染時(shí)值不變化也會(huì)執(zhí)行
watch: {
被監(jiān)聽的數(shù)據(jù): {
handler(新值, 舊值) {
相關(guān)代碼邏輯...
}
}
}
- 被監(jiān)聽的數(shù)據(jù):data中定義的數(shù)據(jù)
- 新值:該數(shù)據(jù)改變后的新值;
- 舊值:該數(shù)據(jù)改變之前的值。
常見應(yīng)用
- 監(jiān)聽本組件計(jì)算和監(jiān)聽
- 計(jì)算或監(jiān)聽父傳子的props值
- 分為簡單數(shù)據(jù)類型和復(fù)雜數(shù)據(jù)類型監(jiān)聽,監(jiān)聽方法如上watch的使用
- 監(jiān)聽vuex的state或者getters值的變化
computed:{
stateDemo(){
return this.$store.state.demoState;
}
}
watch:{
stateDemo(){
console.log('vuex變化啦')
}
}
常見錯(cuò)誤
當(dāng)修改父組件傳過來的值,會(huì)報(bào)錯(cuò)
props:['listShop'],
data(){
return{}
},
created(){
this.listShop=30
}
報(bào)錯(cuò),錯(cuò)誤是說的避免直接修改父組件傳入的值,因?yàn)闀?huì)改變父組件的值
解決方法1,如果傳的是簡單類型,就在data中重新定義一個(gè)變量,改變指向,復(fù)雜類型不行,復(fù)雜類型存的是指針
//不會(huì)有任何報(bào)錯(cuò),也不會(huì)影響父組件!
props:['listShop'],
data(){
return{
listShopChild:this.listShop //改變指向
}
},
created(){
this.listShopChild=30
}
但如果是復(fù)雜類型,因?yàn)榇娴氖侵羔?,賦值給新變量也會(huì)改變原始變量值
方法:
1.手動(dòng)深度克隆
2.Object.assign,只會(huì)對只是一級屬性復(fù)制,比淺拷貝多深拷貝了一層而已,所以還是無法達(dá)到深度克隆的目的.
3.強(qiáng)大的JSON.stringify和JSON.parse
4.直接用computed改變
//數(shù)組深度克隆:
var x = [1,2,3];
var y = [];
for (var i = 0; i < x.length; i++) {
y[i]=x[i];
}
console.log(y); //[1,2,3]
y.push(4);
console.log(y); //[1,2,3,4]
console.log(x); //[1,2,3]
//對象深度克隆:
var x = {a:1,b:2};
var y = {};
for(var i in x){
y[i] = x[i];
}
console.log(y); //Object {a: 1, b: 2}
y.c = 3;
console.log(y); //Object {a: 1, b: 2, c: 3}
console.log(x); //Object {a: 1, b: 2}
//函數(shù)深度克隆
//為什么函數(shù)可以直接賦值克隆?
//由于函數(shù)對象克隆之后的對象會(huì)單獨(dú)復(fù)制一次并存儲(chǔ)實(shí)際數(shù)據(jù),因此并不會(huì)影響克隆之前的對象。所以采用簡單的復(fù)制“=”即可完成克隆。
var x = function(){console.log(1);};
var y = x;
y = function(){console.log(2);};
x(); //1
y(); //2
//方法三 const obj1 = JSON.parse(JSON.stringify(obj));
//方法四
computed:{
listShopChild(){
return this.listShop
}
}
到此這篇關(guān)于Vue computed與watch用法區(qū)分的文章就介紹到這了,更多相關(guān)Vue computed與watch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue如何實(shí)現(xiàn)響應(yīng)式系統(tǒng)
這篇文章給大家整理了關(guān)于Vue如何實(shí)現(xiàn)響應(yīng)式系統(tǒng)的相關(guān)知識(shí)點(diǎn)內(nèi)容,有興趣的朋友可以參考學(xué)習(xí)下。2018-07-07
Vue cli構(gòu)建及項(xiàng)目打包以及出現(xiàn)的問題解決
這篇文章主要介紹了Vue cli構(gòu)建及項(xiàng)目打包以及出現(xiàn)的問題解決,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
Vue框架+Element-ui(el-upload組件)使用http-request方法上傳文件并顯示文件上傳進(jìn)度功能
這篇文章主要介紹了Vue框架+Element-ui(el-upload組件)使用http-request方法上傳文件并顯示文件上傳進(jìn)度功能,本通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-08-08
Vue前端開發(fā)之實(shí)現(xiàn)交錯(cuò)過渡動(dòng)畫效果
這篇文章主要為大家詳細(xì)介紹了如何通過Vue實(shí)現(xiàn)交錯(cuò)過渡動(dòng)畫效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
nuxt實(shí)現(xiàn)封裝axios并且獲取token
這篇文章主要介紹了nuxt實(shí)現(xiàn)封裝axios并且獲取token,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
解決Vue3.0刷新頁面警告[Vue Router warn]:No match 
這篇文章主要介紹了解決Vue3.0刷新頁面警告[Vue Router warn]:No match found for location with path /xxx問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03

