VUE watch與computed異同

在vue的項(xiàng)目中攻冷,我們時(shí)常會(huì)需要對(duì)data的改變做出處理丈攒,這時(shí)候就需要用到watch和computed這兩個(gè)屬性,既然都是數(shù)值改變觸發(fā)改變的屬性狞甚,他們之間又有什么異同呢锁摔?筆者將在接下來(lái)進(jìn)行解析

computed:計(jì)算屬性

通過(guò)屬性計(jì)算而得來(lái)的屬性

1. get用法
data: {
  firstName: 'Liu',
  lastName: 'lu'
},
computed: {
  fullName: function () {
    return this.firstName + ' ' + this.lastName
  }
}

fullName不可在data里面定義,因?yàn)閷?duì)應(yīng)的computed作為計(jì)算屬性定義fullName并返回對(duì)應(yīng)的結(jié)果給這個(gè)變量,變量不可被重復(fù)定義和賦值

2.get和set用法
data: {
    firstName: 'Liu',
    lastName: 'lu'
  },
  computed: {
  fullName:{
   get(){//回調(diào)函數(shù) 當(dāng)需要讀取當(dāng)前屬性值時(shí)執(zhí)行,根據(jù)相關(guān)數(shù)據(jù)計(jì)算并返回當(dāng)前屬性的值
      return this.firstName + ' ' + this.lastName
    },
   set(val){//監(jiān)視當(dāng)前屬性值的變化入愧,當(dāng)屬性值發(fā)生變化時(shí)執(zhí)行鄙漏,更新相關(guān)的屬性數(shù)據(jù)
       //val就是fullName的最新屬性值
       console.log(val)
        const names = val.split(' ');
        console.log(names)
        this.firstName = names[0];
        this.lastName = names[1];
   }
   }
  }

注意:
1、computed內(nèi)部的函數(shù)名稱(chēng)可以隨意編寫(xiě)
2棺蛛、computed內(nèi)部的函數(shù)必須通過(guò)return的方式將結(jié)果進(jìn)行返回怔蚌,最好不要在內(nèi)部進(jìn)行賦值操作
3、雖然computed內(nèi)部是以函數(shù)的方式進(jìn)行編寫(xiě)旁赊,但是在調(diào)用的時(shí)候并不是一個(gè)函數(shù)桦踊,所以不需要加()
4、只要函數(shù)內(nèi)部所依賴(lài)的屬性發(fā)生了改變终畅,那么這個(gè)函數(shù)就會(huì)自己調(diào)用
5籍胯、如果函數(shù)內(nèi)部所依賴(lài)的屬性沒(méi)有發(fā)生改變的時(shí)候computed會(huì)從緩存中讀取結(jié)果

總結(jié):computed中的方法都是依賴(lài)于Vue中data里面的屬性,如果屬性發(fā)生了改變那么computed中所對(duì)應(yīng)的函數(shù)就會(huì)去執(zhí)行

使用的場(chǎng)景:當(dāng)多個(gè)屬性影響一個(gè)屬性的時(shí)候我們就需要用到computed离福,如下圖


image.png

watch:屬性監(jiān)聽(tīng)

作用:監(jiān)聽(tīng)data中屬性的變化 當(dāng)data中的屬性發(fā)生了改變后杖狼,那么watch中相對(duì)應(yīng)的函數(shù)就會(huì)執(zhí)行


image.png
1.示例
data: {
    firstName: 'Foo',
    lastName: 'Bar',
    fullName: 'Foo Bar'
  },
  watch: {
     firstName: function (val) {
     this.fullName = val + ' ' + this.lastName
  },
  lastName: function (val) {
     this.fullName = this.firstName + ' ' + val
   }
   }
2.監(jiān)聽(tīng)簡(jiǎn)單數(shù)據(jù)類(lèi)型
data(){
      return{
        'first':2
      }
    },
    watch:{
      first(){
        console.log(this.first)
      }
    }
3.監(jiān)聽(tīng)對(duì)象(數(shù)組)需用深度監(jiān)聽(tīng)
data(){
      return{
        'first':{
          second:0
        }
      }
    },
    watch:{
      secondChange:{
        handler(oldVal,newVal){
          console.log(oldVal)
          console.log(newVal)
        },
        deep:true
      }
    }

console.log打印的結(jié)果,發(fā)現(xiàn)oldVal和newVal值是一樣的,說(shuō)明深度監(jiān)聽(tīng)雖然可以監(jiān)聽(tīng)到對(duì)象的變化,但是無(wú)法監(jiān)聽(tīng)到具體對(duì)象里面那個(gè)屬性的變化(地址沒(méi)有被改變,原先的數(shù)據(jù)被覆蓋)

注意事項(xiàng):
1妖爷、watch中的函數(shù)名稱(chēng)必須是所依賴(lài)data中的屬性名稱(chēng)
2蝶涩、watch中的函數(shù)是不需要調(diào)用的,只要函數(shù)所依賴(lài)的屬性發(fā)生了改變 那么相對(duì)應(yīng)的函數(shù)就會(huì)執(zhí)行
3、watch中的函數(shù)會(huì)有2個(gè)參數(shù) 一個(gè)是新值绿聘,一個(gè)是舊值
4嗽上、watch默認(rèn)情況下無(wú)法監(jiān)聽(tīng)對(duì)象的改變,如果需要進(jìn)行監(jiān)聽(tīng)則需要進(jìn)行深度監(jiān)聽(tīng) 深度監(jiān)聽(tīng)需要配置handler函數(shù)以及deep為true熄攘。(因?yàn)樗粫?huì)監(jiān)聽(tīng)對(duì)象的地址是否發(fā)生了改變兽愤,而值是不會(huì)監(jiān)聽(tīng)的)
5、watch默認(rèn)情況下第一次的時(shí)候不會(huì)去做監(jiān)聽(tīng)挪圾,如果需要在第一次加載的時(shí)候也需要去做監(jiān)聽(tīng)的話(huà)需要設(shè)置immediate:true
6浅萧、watch在特殊情況下是無(wú)法監(jiān)聽(tīng)到數(shù)組的變化
- 通過(guò)下標(biāo)來(lái)更改數(shù)組中的數(shù)據(jù)
- 通過(guò)length來(lái)改變數(shù)組的長(zhǎng)度

解決方案:

  • 通過(guò)Vue實(shí)例方法set進(jìn)行設(shè)置set(object,key/index,value);
 this.$set(this.arr,0,100);
  • 通過(guò)splice來(lái)數(shù)組清空 $delete(object,key/index)
this.$delete(this.arr,0)

7、深度監(jiān)聽(tīng)對(duì)應(yīng)的函數(shù)名必須為handler,否則無(wú)效果,因?yàn)閣atcher里面對(duì)應(yīng)的是對(duì)handler的調(diào)用

總結(jié):

computed常用于值的計(jì)算哲思,如簡(jiǎn)化tempalte里面{{}}計(jì)算和處理props或$emit的傳值惯殊,頁(yè)面重新渲染值不變化,計(jì)算屬性會(huì)立即返回之前的計(jì)算結(jié)果,而不必再次執(zhí)行函數(shù)也殖。
watch常用來(lái)觀察動(dòng)作,聽(tīng)props务热,$emit或本組件的值執(zhí)行異步操作,頁(yè)面重新渲染時(shí)值不變化也會(huì)執(zhí)行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忆嗜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子崎岂,更是在濱河造成了極大的恐慌捆毫,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冲甘,死亡現(xiàn)場(chǎng)離奇詭異绩卤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)江醇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)濒憋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人陶夜,你說(shuō)我怎么就攤上這事凛驮。” “怎么了条辟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵黔夭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我羽嫡,道長(zhǎng)本姥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任杭棵,我火速辦了婚禮婚惫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己辰妙,他們只是感情好鹰祸,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著密浑,像睡著了一般蛙婴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上尔破,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天街图,我揣著相機(jī)與錄音,去河邊找鬼懒构。 笑死餐济,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胆剧。 我是一名探鬼主播絮姆,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秩霍!你這毒婦竟也來(lái)了篙悯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤铃绒,失蹤者是張志新(化名)和其女友劉穎鸽照,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體颠悬,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡矮燎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赔癌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诞外。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖灾票,靈堂內(nèi)的尸體忽然破棺而出浅乔,到底是詐尸還是另有隱情,我是刑警寧澤铝条,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布靖苇,位于F島的核電站,受9級(jí)特大地震影響班缰,放射性物質(zhì)發(fā)生泄漏贤壁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一埠忘、第九天 我趴在偏房一處隱蔽的房頂上張望脾拆。 院中可真熱鬧馒索,春花似錦、人聲如沸名船。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渠驼。三九已至蜈块,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迷扇,已是汗流浹背百揭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜓席,地道東北人器一。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像厨内,于是被迫代替她去往敵國(guó)和親祈秕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容