Vue原理「十八」-- computed和watch的區(qū)別及原理 ***

計(jì)算屬性 computed

computed用來(lái)監(jiān)控自己定義的變量,該變量不在data里面聲明,直接在computed里面定義,然后就可以在頁(yè)面上進(jìn)行雙向數(shù)據(jù)綁定展示出結(jié)果或者用作其他處理

場(chǎng)景:
購(gòu)物車?yán)锩娴纳唐妨斜砗涂偨痤~之間的關(guān)系,只要商品列表里面的商品數(shù)量發(fā)生變化,或減少或增多或刪除商品,總金額都應(yīng)該發(fā)生變化,
這里的這個(gè)總金額使用computed屬性來(lái)進(jìn)行計(jì)算是最好的選擇。(適合多對(duì)一的場(chǎng)景)

多對(duì)一的場(chǎng)景使用:

<p>{{luFei_Name}}</p>
vm = new Vue({
  el:"#app",
  data: {
      // 路飛的全名:蒙奇·D·路飛
      firstName: '蒙奇',
      secName: 'D',
      thirdName: '路飛'
  },
  computed: {
      luFei_Name: function () {
      return this.firstName + this.secName + this.thirdName
      }
  }
})
// 將“路飛”改為“海軍王”
vm.thirdName = '海軍王'  // 蒙奇·D·海軍王

computed使用緩存實(shí)例:

new Vue({
  el: '#app',
  // 設(shè)置兩個(gè)button,點(diǎn)擊分別調(diào)用getMethodsDate,getComputedDate方法
  template: 
'<div id="app">
    <button @click="getMethodsDate">methods</button>
    <button @click="getComputedDate">computed</button>
</div>',
  methods: {
    getMethodsDate: function () {
      alert(new Date())
    },
    // 返回computed選項(xiàng)中設(shè)置的計(jì)算屬性——computedDate
    getComputedDate: function () {
      alert(this.computedDate)
    }
  },
  computed: {
    computedDate: function () {
      return new Date()
    }
  }

注意
1、兩次點(diǎn)擊computed返回的時(shí)間是相同的??!
兩次點(diǎn)擊computed返回的時(shí)間是相同的?。?br> 兩次點(diǎn)擊computed返回的時(shí)間是相同的??!
2、兩次點(diǎn)擊methods返回的時(shí)間是不同的

原因:
new Date()不是依賴型數(shù)據(jù)(不是放在data等對(duì)象下的實(shí)例數(shù)據(jù)),所以computed只提供了緩存的值,而沒(méi)有重新計(jì)算
只有符合:1.存在依賴型數(shù)據(jù) 2.依賴型數(shù)據(jù)發(fā)生改變這兩個(gè)條件,computed才會(huì)重新計(jì)算。

總結(jié):

  • 支持緩存,只有依賴數(shù)據(jù)發(fā)生改變,才會(huì)重新進(jìn)行計(jì)算;
  • 不支持異步,當(dāng)computed內(nèi)有異步操作時(shí)無(wú)效,無(wú)法監(jiān)聽數(shù)據(jù)的變化;
  • computed 屬性值會(huì)默認(rèn)走緩存,計(jì)算屬性是基于它們的響應(yīng)式依賴進(jìn)行緩存的,也就是基于data中聲明過(guò)或者父組件傳遞的props中的數(shù)據(jù)通過(guò)計(jì)算得到的值
  • 如果一個(gè)屬性是由其他屬性計(jì)算而來(lái)的,這個(gè)屬性依賴其他屬性,是多對(duì)一或者一對(duì)一,一般用computed
  • 如果computed屬性屬性值是函數(shù),那么默認(rèn)會(huì)走get方法;函數(shù)的返回值就是屬性的屬性值;在computed中的,屬性都有一個(gè)get和一個(gè)set方法,當(dāng)數(shù)據(jù)變化時(shí),調(diào)用set方法。

偵聽屬性 watch

watch主要用于監(jiān)控vue實(shí)例的變化,它監(jiān)控的變量當(dāng)然必須在data里面聲明才可以,它可以監(jiān)控一個(gè)變量,也可以是一個(gè)對(duì)象

將對(duì)象寫成字符串的形式:

vm = new Vue({
    el:"#app",
    // (多個(gè))船員名稱數(shù)據(jù) --> 依賴于 --> (1個(gè))一一一名稱數(shù)據(jù) 一個(gè)數(shù)據(jù)變化 --->  多個(gè)數(shù)據(jù)全部變化
    data: {
        haiZeiTuan_Name: '一一一', 
        suoLong: '一一一索隆', 
        naMei: '一一一娜美',
        xiangJiShi: '一一一香吉士'
    },
    watch: {
        haiZeiTuan_Name: function (newName) {   //函數(shù)的名字需是上面data內(nèi)的數(shù)據(jù),只能監(jiān)控一個(gè)對(duì)象或一個(gè)變量
        this.suoLong = newName + '索隆'
        this.naMei = newName + '娜美'
        this.xiangJiShi = newName + '香吉士'
        }
    }
})
vm.haiZeiTuan_Name = '二二二'    

總結(jié):

  • 不支持緩存,數(shù)據(jù)變,直接會(huì)觸發(fā)相應(yīng)的操作;
  • watch支持異步;
  • 監(jiān)聽的函數(shù)接收兩個(gè)參數(shù),第一個(gè)參數(shù)是最新的值,第二個(gè)參數(shù)是輸入之前的值;
  • 當(dāng)一個(gè)屬性發(fā)生變化時(shí),需要執(zhí)行對(duì)應(yīng)的操作;適用一對(duì)多的情況
  • 監(jiān)聽數(shù)據(jù)必須是data中聲明過(guò)或者父組件傳遞過(guò)來(lái)的props中的數(shù)據(jù),當(dāng)數(shù)據(jù)變化時(shí),觸發(fā)其他操作,函數(shù)有兩個(gè)參數(shù),
      immediate:組件加載立即觸發(fā)回調(diào)函數(shù)執(zhí)行,
      deep: 深度監(jiān)聽,為了發(fā)現(xiàn)對(duì)象內(nèi)部值的變化,復(fù)雜類型的數(shù)據(jù)時(shí)使用,例如數(shù)組中的對(duì)象內(nèi)容的改變,注意監(jiān)聽數(shù)組的變動(dòng)不需要這么做。注意:deep無(wú)法監(jiān)聽到數(shù)組的變動(dòng)和對(duì)象的新增,參考vue數(shù)組變異,只有以響應(yīng)式的方式觸發(fā)才會(huì)被監(jiān)聽到。

計(jì)算屬性 method與 偵聽屬性 watch區(qū)別

watch只能監(jiān)聽一個(gè)對(duì)象或變量(對(duì)象或變量必須是上面data內(nèi)的數(shù)據(jù),對(duì)象的話可以寫成字符串形式“object.xxx”:對(duì)象內(nèi)部的xxx),比如上面watch的案例,他的內(nèi)部可以寫多個(gè)數(shù)據(jù)與這個(gè)監(jiān)聽的數(shù)據(jù)進(jìn)行關(guān)聯(lián),當(dāng)該數(shù)據(jù)發(fā)生改變的時(shí)候,所有的內(nèi)部數(shù)據(jù)也都會(huì)隨著改變,可以做一些開銷大的操作,可以進(jìn)行異步操作
computed是計(jì)算屬性,需寫成函數(shù)的形式(可自定義函數(shù)名),該函數(shù)內(nèi)部的變量依賴于data內(nèi)的數(shù)據(jù),但內(nèi)部定義的變量可以緩存,當(dāng)外面數(shù)據(jù)沒(méi)有更改的時(shí)候,他是不會(huì)觸發(fā)的,當(dāng)所依賴的數(shù)據(jù)進(jìn)行更改后,他才會(huì)重新計(jì)算,更新數(shù)據(jù),他的內(nèi)部可以監(jiān)聽多個(gè)依賴的數(shù)據(jù),他不會(huì)進(jìn)行異步操作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容