為了讓 View 專注在顯示資料,你應該將需要複雜計算的程式邏輯抽離,讓顯示 View 的模版簡潔,Vue 設計了一個計算屬性讓你這麼做。
計算屬性
使用範例:HTML<div id="vm">
原本的內容:
<p>{{ content }}</p>
<hr>
摘要:
<p>{{ summary }}</p>
</div>
<script>
var vm = new Vue({
el: '#vm',
data: {
content: '為了讓 View 簡單化,你應該將需要複雜計算的程式邏輯抽離,讓顯示 View 的模版簡潔,Vue 設計了一個計算屬性讓你這麼做。'
},
computed: {
summary: function () {
if (this.content.length > 20) {
return this.content.slice(0, 17) + '...'
}
return this.content
}
}
})
</script>
輸出結果:
我們前面已經用過 el
、data
、filters
、methods
這幾個選項物件中的屬性,現在又用到一個新的 computed
稱為計算屬性。它的用途和 data
相同,都是資料,差別在於,data
是直接指定內容,而 computed
是一個函式,它的資料會先經過計算,而且可以將 data
中的資料當成計算依據。在 computed
中的函式,可以透過 this
來取得 data
中的資料。
計算屬性 (computed) 與方法 (methods) 的差別
在計算屬性的做法其實拿到方法中是差不多的:HTML<!-- 在雙括號中改為呼叫方法 -->
<p>{{ summaryMethod() }}</p>
// 在 computed 中的計算屬性 summary,現在原封不動的移動到 methods 中
差別除了一個是回傳資料,一個是呼叫函式然後由其回傳值之外,它的行為會略有不同。計算 (computed) 屬性依賴資料來進行運算,並且會將運算結果暫存,也就是說,和它相依的資料如果沒有發生改變,它就不會再次運算,而是直接回傳暫存的資料,只有當相依的資料發生改變,它才會執行運算。
方法 (methods) 屬性則是無論如何,只要被呼叫就會執行運算。
測試範例:
HTML<div id="vm">
原本的內容:
<p>{{ content }}</p>
<hr>
摘要:
<p>{{ summaryMethod() }}</p>
<p>{{ summaryMethod() }}</p>
<p>{{ summaryMethod() }}</p>
<p>{{ summaryComputed }}</p>
<p>{{ summaryComputed }}</p>
<p>{{ summaryComputed }}</p>
</div>
<script>
var vm = new Vue({
el: '#vm',
data: {
content: '為了讓 View 簡單化,你應該將需要複雜計算的程式邏輯抽離,讓顯示 View 的模版簡潔,Vue 設計了一個計算屬性讓你這麼做。'
},
methods: {
summaryMethod: function () {
console.log('method')
if (this.content.length > 20) {
return this.content.slice(0, 17) + '...'
}
return this.content
}
},
computed: {
summaryComputed: function () {
console.log('compute')
if (this.content.length > 20) {
return this.content.slice(0, 17) + '...'
}
return this.content
}
}
})
</script>
在瀏覽器的主控台 (console) 的 log 中可以看到 method
會顯示 3 次,而 compute
則只有 1 次。如果要大量的運算而且運算過後資料並不會改變的話,就用計算 (computed) 屬性,相反的,如果你需要每次都進行運算而不要暫存運算結果,就用方法 (methods) 屬性。
我要留言
留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。