VUE復(fù)習(xí)筆記5(計(jì)算屬性和偵聽(tīng)器)

計(jì)算屬性

雙括弧的模板表達(dá)式是很便利的唧瘾,但是當(dāng)初設(shè)計(jì)他只是用來(lái)做簡(jiǎn)單的運(yùn)算,如果在模板中放入大量的邏輯缨该,會(huì)讓模板過(guò)重偎行,并且不好維護(hù)。
如:

<div id="example">
  {{ message.split('').reverse().join('') }}
</div>

這里是修改了message的內(nèi)容贰拿,雖然這樣寫(xiě)也可以蛤袒,但是有點(diǎn)違反了當(dāng)初模板語(yǔ)法的設(shè)計(jì)思路,不推薦膨更。

對(duì)于任何比較復(fù)雜的邏輯汗盘,推薦使用 計(jì)算屬性

<div id="example">
  <p>Original message: "{{ message }}"</p>
  <p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
var vm = new Vue({
  el: '#example',
  data: {
    message: 'Hello'
  },
  computed: {
    // 計(jì)算屬性的 getter
    reversedMessage: function () {
      // `this` 指向 vm 實(shí)例
      return this.message.split('').reverse().join('')
    }
  }
})

這里我們聲明了一個(gè)計(jì)算屬性 reversedMessage询一。我們提供的函數(shù)將用作屬性 vm.reversedMessagegetter 函數(shù)

reversedMessage 最后得到方法返回的修改過(guò)的值,插入到模板語(yǔ)法處隐孽。這也是響應(yīng)式的,只要原來(lái)的message修改健蕊,就會(huì)觸發(fā)計(jì)算屬性菱阵。

計(jì)算屬性緩存 vs 方法

剛才提到的 顛倒message的處理,我們通過(guò)methods中調(diào)用方法也一樣可以做到缩功。

<p>Reversed message: "{{ reversedMessage() }}"</p>

// 在組件中
methods: {
  reversedMessage: function () {
    return this.message.split('').reverse().join('')
  }
}

我們可以將同一函數(shù)定義為一個(gè)方法而不是一個(gè)計(jì)算屬性晴及。兩種方式的最終結(jié)果確實(shí)是完全相同的。

不同的地方是嫡锌,計(jì)算屬性是基于他們之間的依賴(lài)進(jìn)行緩存的虑稼,只有在依賴(lài)關(guān)系或者值發(fā)生改變的時(shí)候才會(huì)重新請(qǐng)求,這就意味著只要 message 還沒(méi)有發(fā)生改變势木,多次訪問(wèn) reversedMessage 計(jì)算屬性會(huì)立即返回之前的計(jì)算結(jié)果蛛倦,而不必再次執(zhí)行函數(shù)。

這樣效率和性能也更加高啦桌,而且不需要手動(dòng)觸發(fā)溯壶。

相比方法,每次重新渲染甫男,調(diào)用的方法總會(huì)執(zhí)行的且改。

我們?yōu)槭裁葱枰彺妫考僭O(shè)我們有一個(gè)性能開(kāi)銷(xiāo)比較大的計(jì)算屬性 A板驳,它需要遍歷一個(gè)巨大的數(shù)組并做大量的計(jì)算又跛。然后我們可能有其他的計(jì)算屬性依賴(lài)于 A 。如果沒(méi)有緩存若治,我們將不可避免的多次執(zhí)行 A 的 getter慨蓝!如果你不希望有緩存感混,請(qǐng)用方法來(lái)替代。

計(jì)算屬性 vs 監(jiān)聽(tīng)屬性

Vue提供了一種更通用的方式來(lái)觀察和響應(yīng)Vue實(shí)例上的數(shù)據(jù)變動(dòng)菌仁,監(jiān)聽(tīng)屬性,當(dāng)你的部分?jǐn)?shù)據(jù)需要隨著其他數(shù)據(jù)的變動(dòng)而變動(dòng)時(shí)静暂,可容易 濫用watch济丘,特別是如果你之前使用過(guò) angular,通常更好的方法是使用計(jì)算屬性洽蛀,而不是命令形式的 watch 回調(diào)摹迷。

div id="demo">{{ fullName }}</div>
var vm = new Vue({
  el: '#demo',
  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
    }
  }
})

上面代碼是命令式且重復(fù)的,他通過(guò)監(jiān)聽(tīng)2個(gè)值的變化來(lái)重新渲染新的值。將它與計(jì)算屬性的版本進(jìn)行比較:

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})

計(jì)算屬性的setter

計(jì)算屬性默認(rèn)只有 getter郊供,不過(guò)如果需要峡碉,可以添加一個(gè) setter

// ...
computed: {
  fullName: {
    // getter
    get: function () {
      return this.firstName + ' ' + this.lastName
    },
    // setter
    set: function (newValue) {
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}
// 

監(jiān)聽(tīng)器

雖然計(jì)算屬性在大多數(shù)情況下都比較合適,但有時(shí)候也是需要一個(gè)自定義的監(jiān)聽(tīng)器驮审。這就是為什么vue通過(guò) watch 選項(xiàng)提供了一個(gè)更加通用的方法來(lái)響應(yīng)數(shù)據(jù)的變化鲫寄。當(dāng)需要在數(shù)據(jù)變化時(shí)執(zhí)行異步或者開(kāi)銷(xiāo)較大的操作時(shí),這個(gè)時(shí)候使用 watch 是最有用的疯淫。

除了 watch 選項(xiàng)之外地来,您還可以使用命令式的 vm.$watch API

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熙掺,一起剝皮案震驚了整個(gè)濱河市未斑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌币绩,老刑警劉巖蜡秽,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異缆镣,居然都是意外死亡芽突,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)董瞻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)诉瓦,“玉大人,你說(shuō)我怎么就攤上這事力细〔窃瑁” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵眠蚂,是天一觀的道長(zhǎng)煞聪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)逝慧,這世上最難降的妖魔是什么昔脯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任啄糙,我火速辦了婚禮,結(jié)果婚禮上云稚,老公的妹妹穿的比我還像新娘隧饼。我一直安慰自己,他們只是感情好静陈,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布燕雁。 她就那樣靜靜地躺著,像睡著了一般鲸拥。 火紅的嫁衣襯著肌膚如雪拐格。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,166評(píng)論 1 308
  • 那天刑赶,我揣著相機(jī)與錄音捏浊,去河邊找鬼。 笑死撞叨,一個(gè)胖子當(dāng)著我的面吹牛金踪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牵敷,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼热康,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了劣领?” 一聲冷哼從身側(cè)響起姐军,我...
    開(kāi)封第一講書(shū)人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尖淘,沒(méi)想到半個(gè)月后奕锌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡村生,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年惊暴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趁桃。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辽话,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卫病,到底是詐尸還是另有隱情油啤,我是刑警寧澤,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布蟀苛,位于F島的核電站益咬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏帜平。R本人自食惡果不足惜幽告,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一梅鹦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冗锁,春花似錦齐唆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至芋绸,卻和暖如春媒殉,著一層夾襖步出監(jiān)牢的瞬間担敌,已是汗流浹背摔敛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留全封,地道東北人马昙。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像刹悴,于是被迫代替她去往敵國(guó)和親行楞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359

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

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容土匀,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容子房。關(guān)于...
    云之外閱讀 5,052評(píng)論 0 29
  • 1.安裝 可以簡(jiǎn)單地在頁(yè)面引入Vue.js作為獨(dú)立版本,Vue即被注冊(cè)為全局變量就轧,可以在頁(yè)面使用了证杭。 如果希望搭建...
    Awey閱讀 11,034評(píng)論 4 129
  • 寫(xiě)在最前面 上篇的vue的使用 說(shuō)了vue生命周期、vue實(shí)例妒御、模板語(yǔ)法解愤。這次我們來(lái)說(shuō)vue的計(jì)算屬性和偵聽(tīng)器 計(jì)...
    StevenTang閱讀 335評(píng)論 0 1
  • 主要還是自己看的,所有內(nèi)容來(lái)自官方文檔乎莉。 介紹 Vue.js 是什么 Vue (讀音 /vju?/送讲,類(lèi)似于 vie...
    Leonzai閱讀 3,355評(píng)論 0 25
  • 昨天,是我在北京二十年里最委屈的一天惋啃。四十多歲了哼鬓,從西城法院出來(lái),一人一包边灭,走在北京的大街上魄宏,邊走邊哭,嚎啕大哭…...
    清風(fēng)破刀閱讀 156評(píng)論 0 0