一. 計(jì)算屬性
<p> {{ message.split(' ') . reverse( ) . join(' ') }} </p>
對(duì)于任何復(fù)雜邏輯,我們都應(yīng)該使用計(jì)算屬性
在瀏覽器的控制臺(tái)中改變vm.message的值,相應(yīng)的vm.reversedMessage的返回值就會(huì)改變
你可以像綁定普通屬性一樣在模板中綁定計(jì)算屬性。Vue 知道vm.reversedMessage依賴于vm.message,因此當(dāng)vm.message發(fā)生改變時(shí),所有依賴于vm.reversedMessage的綁定也會(huì)更新。而且最妙的是我們已經(jīng)以聲明的方式創(chuàng)建了這種依賴關(guān)系:計(jì)算屬性的 getter 函數(shù)是沒(méi)有連帶影響 (side effect),這使得它易于測(cè)試和推理。
二. 計(jì)算屬性的緩存VS方法
我們也可以在表達(dá)式中調(diào)用方法來(lái)達(dá)到同樣的效果
重點(diǎn):? 我們可以將同一函數(shù)定義為一個(gè)方法而不是一個(gè)計(jì)算屬性。對(duì)于最終的結(jié)果,兩種方式確實(shí)是相同的。然而,不同的是計(jì)算屬性是基于它們的依賴進(jìn)行緩存的。計(jì)算屬性只有在它的相關(guān)依賴發(fā)生改變時(shí)才會(huì)重新求值。這就意味著只要message還沒(méi)有發(fā)生改變,多次訪問(wèn)reversedMessage計(jì)算屬性會(huì)立即返回之前的計(jì)算結(jié)果,而不必再次執(zhí)行函數(shù)。
三. ?計(jì)算屬性 VS 被觀察的屬性
Vue 確實(shí)提供了一種更通用的方式來(lái)觀察和響應(yīng) Vue 實(shí)例上的數(shù)據(jù)變動(dòng):watch 屬性。當(dāng)你有一些數(shù)據(jù)需要隨著其它數(shù)據(jù)變動(dòng)而變動(dòng)時(shí),你很容易濫用watch——特別是如果你之前使用過(guò) AngularJS。然而,通常更好的想法是使用計(jì)算屬性而不是命令式的watch回調(diào)。細(xì)想一下這個(gè)例子:
四. 計(jì)算屬性的setter
計(jì)算屬性中默認(rèn)只有g(shù)etter方法,不過(guò)需要時(shí)也可以添加setter方法
五. 觀察者
雖然計(jì)算屬性在大多數(shù)情況下更合適,但有時(shí)也需要一個(gè)自定義的 watcher。這是為什么 Vue 通過(guò)watch選項(xiàng)提供一個(gè)更通用的方法,來(lái)響應(yīng)數(shù)據(jù)的變化。當(dāng)你想要在數(shù)據(jù)變化響應(yīng)時(shí),執(zhí)行異步操作或開(kāi)銷較大的操作,這是很有用的。
在這個(gè)示例中,使用watch選項(xiàng)允許我們執(zhí)行異步操作 (訪問(wèn)一個(gè) API),限制我們執(zhí)行該操作的頻率,并在我們得到最終結(jié)果前,設(shè)置中間狀態(tài)。這是計(jì)算屬性無(wú)法做到的。
除了watch選項(xiàng)之外,您還可以使用vm.$watch API命令。