computed:計算屬性將被混入到 Vue 實例中。所有 getter 和 setter 的 this 上下文自動地綁定為 Vue 實例。
methods:methods 將被混入到 Vue 實例中。可以直接通過 VM 實例訪問這些方法,或者在指令表達式中使用。方法中的 this 自動綁定為 Vue 實例。
watch:是一種更通用的方式來觀察和響應 Vue 實例上的數據變動。一個對象,鍵是需要觀察的表達式,值是對應回調函數。值也可以是方法名,或者包含選項的對象。Vue 實例將會在實例化時調用 $watch(),遍歷 watch 對象的每一個屬性。
通俗來講,
1. computed是在HTML DOM加載后馬上執行的,如賦值;
2. methods則必須要有一定的觸發條件才能執行,如點擊事件;
3. watch它用于觀察Vue實例上的數據變動。對應一個對象,鍵是觀察表達式,值是對應回調。值也可以是方法名,或者是對象,包含選項。
所以他們的執行順序為:默認加載的時候先computed再watch,不執行methods;等觸發某一事件后,則是:先methods再watch。
- computed稱為計算屬性,顧名思義,計算就要返回一個計算的結果,所以,當我們要處理大量的邏輯,但是最后要取得最后的結果的時候可以用computed。
簡單示例: 要求: <input type="text v-model="num1"><input type="text v-model="num2">
現在要返回num1和num2的和; <script>
new Vue({
el:"#box",
data:{
num1:0,
num2:0
}
computed:{
result:function(){
return this.num1 + this.num2
// 計算屬性必須有一個返回值
}
}
})
</script>
- methods:是方法的意思,在js中,我們把一些函數叫做方法,一般情況下,要觸發這個方法就要執行,要執行就要有一個源來觸發,所以就需要一個事件源,這是和computed的一點不同之處。
methods的示例:
要求:
<button @click="do()">點擊彈出<\/button>
<script>
new Vue({
el:"#box",
data:{
num1:0,
num2:0
}
methods:{
do:function(){
alert('ok')
//這里根據情況,可以返回有返回值也可以沒有返回值。
}
}
})
</script>
對比computed 和 methods
- computed計算的結果如果不發生改變就不會觸發result這個函數。而methods中一般都是定義的需要事件觸發的一些函數。每次只要觸發事件,就會執行對應的方法。
- computed必須返回一個值頁面綁定的才能取得值,而methods中可以只執行邏輯代碼,可以有返回值,也可以沒有。
- 如果把computed中的方法寫到method中會浪費性能。
<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: {
reversedMessage: function () {
return this.message.split('').reverse().join('')
}
},
methods: {
reverseMessage: function () {
return this.message.split('').reverse().join('')
}
}
})
- 計算屬性只有在它的相關依賴發生改變時才會重新取值。這就意味著只要 message 沒有發生改變,多次訪問 reversedMessage 計算屬性會立即返回之前的計算結果,而不必再次執行函數。也就是說只要不是直接使用瀏覽器刷新頁面,當我們改變數據、DOM操作等引起頁面重新渲染時,計算屬性會直接使用緩存,不會重新執行函數。適合那些計算量很大且改變頻率很低的屬性;
- 如果使用methods,每次頁面重新渲染時都會重新執行methods函數。
- 寫法上:computed計算屬性的方式在用屬性時不用加(),而methods方式在使用時要像方法一樣去用,必須加().