Vue的計算屬性和監聽屬性

Vue 中的計算屬性

使用計算屬性(computed)有一個好處在於它有一個緩存機制,因此它不需要每次都重新計算。當其依賴屬性的值發生變化時,這個屬性的值會自動更新,與之相關的 DOM 部分也會同步自動更新。在處理一些複雜邏輯時計算屬性是很有用的。

在 Vue 中我們可以使用模板語法 {{}} 來展示一些數據,而當在模板中放入太多的邏輯會讓模板過重且難以維護。這種情況下,Vue 給我們提供了一個特別好的解決方法,就是使用計算屬性。我們可以將一些需要計算的過程寫入到一個計算屬性中去,然後讓它動態的計算就可以了。

示例:

下面我們通過一個例子來看一下計算屬性的使用,下面是一個用於求和的小例子:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue的屬性_俠課島(9xkd.com)</title>
<script src="./src/vue.min.js"></script>
</head>
<body>
    <h1>創建第一個Vue應用</h1>
    <div id="app">
        <!-- 大俠是隻喵喵 -->
        <p>大俠的體重爲:{{a}}千克</p>
        <p>水星仔的體重爲:{{b}}千克</p>
        <p>小師妹的體重爲: {{c}} 千克</p>
        <p>它們的體重之和爲:{{a + b + c}}千克</p>
    </div>
    <script>
        var app = new Vue({
            el:"#app",
            data() {
                return{
                    a:10,
                    b:65,
                    c:44
                }
            }
        })
    </script>
</body>
</html>

此時我們要對數據求和,是不是需要在模板中將 a、b、c 等屬性都加起來,例如上述的 {{a + b + c}},這樣會很不方便,且會讓模板過重且難以維護。

但是如果我們使用計算屬性,如下所示:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue的屬性_俠課島(9xkd.com)</title>
<script src="./src/vue.min.js"></script>
</head>
<body>
    <h1>創建第一個Vue應用</h1>
    <div id="app">
        <!-- 大俠是隻喵喵 -->
        <p>大俠的體重爲:{{a}}千克</p>
        <p>水星仔的體重爲:{{b}}千克</p>
        <p>小師妹的體重爲: {{c}} 千克</p>
        <p>它們的體重之和爲:{{sum}}千克</p>
    </div>
    <script>
        var app = new Vue({
            el:"#app",
            data() {
                return{
                    a:10,
                    b:65,
                    c:44
                }
            },
            computed:{
                // sum就是計算屬性
                sum:function(){
                    return this.a + this.b + this.c
                }
            }
        })
    </script>
</body>
</html>

這樣在 computed 中定義一個計算屬性 sum 後,就不用在模板中進行復雜的計算了。效果圖如下所示:

Vue中的監聽屬性

監聽屬性(watch)可以監聽一個函數或者是一個變量,通過 watch 來響應數據的變化。雖然大多數情況計算屬性都可以滿足需要,但有時還是需要使用偵聽器。當需要在數據發生變化時執行異步操作或者開銷較大的操作時,就需要自定義監聽器。

示例:

例如我們想實現一個計數器,我們可以通過 watch 來響應數據的變化:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Vue的屬性、方法和生命週期_俠課島(9xkd.com)</title>
<script src="./src/vue.min.js"></script>
</head>
<body>
    <h1>計數器的實現</h1>
    <div id="app">
        <p>計算器:{{num}}</p>
        <button @click="num++">點我加一</button>
    </div>
    <script>
        var app = new Vue({
            el:"#app",
            data() {
                return{
                    num: 1
                }
            }
        })
        // 監聽器
        app.$watch('num', function(navl, oval){
            alert("計數器的值從 " + oval + "變爲" + navl);
        });
    </script>
</body>
</html>

watch 這個對象裏面是一個函數,函數的名稱是 data 中的屬性名稱(即num),且 watch 中的函數不需要調用。

當屬性 num 發生改變,就會觸發 watch 函數(num 所對應的函數),每個函數都會接受兩個值,一個是新值(navl),一個是舊值(oval)。

我們來看代碼在瀏覽器中的演示效果: 當我們點擊 點我加一 按鈕時,會彈出上圖中的彈出層,告訴我們“計數器的值從 1 變爲 2”,然後我們點擊彈出層的 “確認” 按鈕,計數器顯示會變成 2。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章