3、計算屬性


title: 3、計算屬性
date: 2017-07-27 10:19:21
tags: vue筆記(妙味)


之前說過,模板內(nèi)在插值中寫表達(dá)式很方便,但是如果放太多邏輯會讓模板過重難以維護(hù)。所以在模板內(nèi)只適合簡單的運算,稍微復(fù)雜的語句就需要計算屬性了。

computed和methods

計算屬性應(yīng)該放到computed屬性中,函數(shù)放到methods中,而實際上計算屬性的語句也是寫到函數(shù)里,所以其實寫到methods也是可以的,但兩者還是有區(qū)別的。

<div id="app">
    <p>Original message: "{{ message }}"</p>
    <p>Computed reversed message: "{{ reversedMessage }}"</p>
    <p>Methods reversed message: "{{ reversedMessage1() }}"</p>
</div>
var vm = new Vue({
        el:'#app',
        data:{
            message:'hello'
        },
    computed:{
        reversedMessage: function(){
            return this.message.split('').reverse().join('')
        }
    },
    methods:{
        reversedMessage1: function(){
            return this.message.split('').reverse().join('')
        }
    }
})

對于最終的結(jié)果,methodscomputed是相同的,

不同的是computed是基于它們的依賴進(jìn)行緩存的。計算屬性只有在它的相關(guān)依賴發(fā)生改變時才會重新求值,這就意味著只要message還沒有發(fā)生改變,多次訪問reversedMessage計算屬性會立即返回之前的計算結(jié)果,而不必再次執(zhí)行函數(shù)(假如函數(shù)里有獲取當(dāng)前時間的語句也不會執(zhí)行)。

相比而言,只要發(fā)生重新渲染,methods調(diào)用總會執(zhí)行該函數(shù)。

所以假如有一個性能開銷比較大的計算屬性A,而且可能別的計算屬性還依賴于A的返回值,那么有緩存可以節(jié)省性能。但是不需要緩存時可以用methods代替。

watch

Vue提供了一種更通用的方式來觀察和響應(yīng)Vue實例上的數(shù)據(jù)變動,就是watch屬性。

但是當(dāng)有一些數(shù)據(jù)需要隨著其他數(shù)據(jù)變動而變動時,很容易濫用watch,通常更好的方法是使用computed屬性而不是命令式的watch。

<div id="app1">
    {{ fullName }}
</div>

<div id="app2">
    {{ fullName }}
</div>

watch的方式,只要data中的數(shù)據(jù)發(fā)生變化,watch就會監(jiān)測到,并執(zhí)行相對應(yīng)的方法。

var app1 = new Vue({
    el:'#app1',
    data:{
        firstName:'Foo',
        lastName:'Bar',
        fullName:'Foo Bar'
    },
    watch:{
        firstName: function(val){
            this.fullName = val + ' ' + this.lastName;
        },
        lastName:function(val){
            this.fullName = this.firstName + ' ' + val;
        }
    }
})
app1.firstName = 'tim';

computed的方式,這里就是上面說的,fullName會隨著firstNamelastName的改變而改變。很明顯在這里使用computed的方法更簡潔。

var app2 = new Vue({
    el:'#app2',
    data:{
        firstName:'Foo',
        lastName:'Bar'
    },
    computed:{
        fullName: function(){
            return this.firstName + ' ' + this.lastName;
        }
    }
})
app2.firstName = 'tom';

get和set

computed中不僅有get,還有set方法。

之前介紹的都是get方法,也就是data中的數(shù)據(jù)作為參數(shù),通過函數(shù)內(nèi)部計算,返回一個新的數(shù)據(jù)。而set方法是將計算后得新數(shù)據(jù)的值作為參數(shù),改變原本data中的數(shù)據(jù)。

<div id="app1">
    {{ fullName }}
</div>
var app1 = new Vue({
    el:'#app1',
    data:{
        firstName:'Foo',
        lastName:'Bar'
    },
    computed:{
        fullName:{
            get:function(){
                return this.firstName + ' ' + this.lastName;
            },
            // 這里會將fullName的值最為參數(shù)傳進(jìn)來。
            set:function(newValue){
                var name = newValue.split(' ');
                this.firstName = name[0];
                this.lastName = name[name.length - 1];
            }
        }
    }
})

// 這里更改fullName的值會調(diào)用set(),然后會改變firstName和lastName的值。在通過get展示在html中
app1.fullName = 'john Doe';

在使用Vue的時候,get會在改變data的數(shù)據(jù)時被調(diào)用,而set會在改變computed中新數(shù)據(jù)的返回值的時候被調(diào)用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容