天天看點

Vue.js--計算屬性

計算屬性

計算屬性用于解決表達式過長或邏輯複雜時的問題。

關鍵字:computed

示例:

<!--進行中繼資料,便于二次利用-->
<div id="myApp">
    今年3月3日發賣的任天堂新一代主機Switch的價格是:{{price}}日元,含稅價格為:{{priceInTax}}日元,折合人名币為:{{pricceChinaRMB}}元。
</div>
<script>
    var myApp = new Vue({
        el: '#myApp',
        data: {
            price: 29980
        },
        computed: {
            priceInTax: function () {
                return this.price * 1.08;
            },
            pricceChinaRMB: function () {
                return Math.round(this.priceInTax / 16.75);
            }
        }
    });
</script>
           
Vue.js--計算屬性

所有的計算屬性都以函數的形式寫在Vue執行個體的computed選項内,最終傳回計算後的結果。

在一個計算屬性裡可以完成各種複雜的邏輯,包括運算、函數調用等,隻要最終傳回一個結果就可以。

注意:計算屬性還可以依賴多個Vue執行個體的資料,隻要其中任一資料發生變化,計算屬性就會重新執行,視圖也會更新。

示例:在購物車内兩個包裹的物品總價。

<div id="app">
    總價:{{ prices }}
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            package1: [
                {
                    name: 'iPhone 11',
                    price: 9000,
                    count: 2
                },
                {
                    name: 'iPad',
                    price: 2888,
                    count: 1
                }
            ],
            package2: [
                {
                    name: 'apple',
                    price: 3,
                    count: 5
                },
                {
                    name: 'banana',
                    price: 2,
                    count: 10
                }
            ]
        },
        computed: {
            prices: function () {
                var temp = 0;
                for (var i = 0; i < this.package1.length; i++) {
                    temp += this.package1[i].price * this.package1[i].count;
                }
                for (var j = 0; j < this.package2.length; j++) {
                    temp += this.package2[j].price * this.package2[j].count;
                }
                return temp;
            }
        }
    });
</script>
           
Vue.js--計算屬性

當package1或package2中的商品有任何變化,比如購買數量變化或增删商品時,計算屬性prices就會自動更新,視圖中的總價也會随之變化。

每一個計算屬性都包含一個getter和setter。上面的示例隻是利用getter來讀取。在我們需要時提供一個setter函數,當手動修改計算屬性的值就像修改一個普通資料那樣時,就會觸發setter函數,執行一些自定義操作。

示例:

<div id="app">
    姓名:{{ fullName }}
</div>
<script>
    var app = new Vue({
        el: '#app',
        data: {
            firstName: 'Jack',
            lastName: 'Green'
        },
        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];
                }
            }
        }
    });
</script>
           
Vue.js--計算屬性

當執行app.fullName = ‘John Doe’;時,setter就會被調用,資料firstName和lastName都會相對更新,視圖同樣也會更新。

絕大多數情況下,隻會使用預設的getter方法來讀取一個計算屬性,在業務中很少用到setter,是以在聲明一個計算屬性時,可以直接使用預設的寫法,不必将getter和setter都聲明。

計算屬性除了上述簡單的文本插值外,還經常用于動态地設定元素的樣式名稱class和内聯樣式style。當使用元件時,計算屬性也經常用來動态傳遞props。

計算屬性還有兩個很實用的小技巧容易被忽略:一是計算屬性可以依賴其他計算屬性;二是計算屬性不僅可以依賴目前Vue執行個體的資料,還可以依賴其他執行個體的資料,例如:

<div id="app1"></div>
<div id="app2">
    {{reversedText}}
</div>
<script>
    var app1 = new Vue({
        el: '#app1',
        data: {
            text: '123,456'
        }
    });
    var app2 = new Vue({
        el: '#app2',
        computed: {
            reversedText: function () {
                //這裡依賴的是執行個體app1的資料text
                return app1.text.split(',').reverse().join(',');
            }
        }
    });
</script>
           

這裡我們建立了兩個Vue執行個體app1和app2,在app2的計算屬性reversedText中,依賴的是app1的資料text,是以當text變化時,執行個體app2的計算屬性也會變化。

繼續閱讀