Vue計算屬性的使用,Vue計算屬性使用

來源:互聯網
上載者:User

Vue計算屬性的使用,Vue計算屬性使用

我們都知道在Vue建構函式的參數對象中有一個【data】屬性,該屬性值是一個對象,該對象是對資料的代理,是一個索引值對並且時刻與頁面表現是一致的,但是這裡面只能是簡單的索引值對,不能擁有商務邏輯,並且由於【data】中的屬性屬於同一個生命週期,所以如果我們需要某一個屬性是依賴於另外一個屬性時,在【data】中是做不到的,於是Vue為我們提供了【計算屬性】

一、計算屬性

1.1 概述

計算屬性歸根結底也是屬性,它也是跟表現層是時刻同步的,雖然我們可以在插值中對資料進行各種處理,但是插值中的運算式處理畢竟只能用於簡單的運算,不能擁有太多的商務邏輯。

<body>  <div id="app">    <h1>{{name.toUpperCase()}}</h1>    <!-- <h1>BLUE</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      name: 'blue'    }  })</script>

上面代碼是我們熟悉的在插值中使用運算式,但是這裡面我們不能寫入業務代碼。

1.2 計算屬性文法

在建構函式的參數對象中有一個【computed】屬性,該屬性就是用於定義計算屬性的,該對象中的【鍵】也就是我們的計算屬性,與【data】不同的是,計算屬性的索引值是一個【擁有傳回值的函數】,該函數中可以訪問到【data】中的所有屬性。

<body>  <div id="app">    <h1>{{rs}}</h1>    <!-- <h1>BLUE LOVE PINK</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      hs: 'BLUE',      wf: "PINK"    },    computed: {      rs:function(){        return `${this.hs} LOVE ${this.wf}`      }    }  })</script>

上面代碼屬性【rs】是定義的一個計算屬性,該屬性值是通過【data】中的兩個屬性值計算得到,返回一個拼接的字串(這兒使用了ES6的【模板字串】)並且當【data】中的相關值變化之後,【rs】屬性都會進行重新計算。

可能剛開始對計算屬性會有些疑惑,比如上面的例子我把代碼寫成下面這樣子也是可以的

<body>  <div id="app">    <h1>{{hs}} LOVE {{wf}}</h1>    <!-- <h1>BLUE LOVE PINK</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      hs: 'BLUE',      wf: "PINK"    }  })</script>

上面的代碼運行效果和我們使用計算屬性的效果是一樣的,但是這樣的寫法只適用於簡單的處理,【計算屬性可以處理更複雜的商務邏輯】,比如我們根據【data】中的一個屬性值進行資料請求用於構建一個屬性,我們就必須使用計算屬性了。

【注意!!】計算屬性雖然是一個方法,但是在Vue內部會被翻譯成一個屬性,我們可以使用執行個體【vm.rs】訪問到資料的。

1.3 計算屬性和過濾器的比較

如果用於對【data】中【單個】屬性的【簡單】處理,推薦使用過濾器,但是如果一個值使用了【data】中至少2個值或者對一個值進行複雜處理,那麼就推薦使用計算屬性了。

<body>  <div id="app">    <h1>{{hs | lover}}</h1>    <!-- <h1>BLUE LOVE PINK</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      hs: 'BLUE',    },    filters: {      lover(value){        return `${value} LOVE PINK`      }    }  })</script>

上面代碼就使用了一個【data】屬性值做簡單的處理,所以使用過濾器,而且也發現了過濾字串“LOVE PINK”是不可變的。

1.4 計算屬性和Methods的比較

計算屬性就是為了定屬性的時候處理複雜的商務邏輯,而且在插值中我們可以使用運算式,那麼我們是否可以通過使用在插值中調用一個有傳回值的函數呢?它和計算屬性又有什麼區別呢?

<body>  <div id="app">    <h1>{{rs}}</h1>    <!-- <h1>EULB</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      name: 'BLUE',    },    computed: {      rs: function () {        return [...this.name].reverse().join('');      }    }  })</script>

上面代碼將資料進行反向處理(使用了【ES6數組字串擴充】 ),當我們改變name的值的時候,計算屬性【rs】會跟著改變。下面我們將它改成一個方法結合插值運算式進行處理,看看區別。

<body>  <div id="app">    <h1>{{ rs() }}</h1>    <!-- <h1>EULB</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      name: 'BLUE',    },    methods: {      rs() {        return [...this.name].reverse().join('');      }    }  })</script>

上面代碼將計算屬性改成了一個方法結合插值運算式,發現效果和計算屬性沒差別,改變name的值的時候頁面也重新整理了。那是不是這兩者就真的沒區別呢,答案當然是否定的,如果沒有區別幹嘛還有計算屬性的存在。

【計算屬性是基於依賴進行緩衝的】,只有計算屬性的依賴發生改變時才會重新求值,也就是說如果依賴沒有發生改變,那麼計算屬性會立刻返回之前的計算結果,假如我們有一個效能開銷比較大的的計算屬性 A ,它需要遍曆一個極大的數組和做大量的計算。然後我們可能有其他的計算屬性依賴於 A 。如果沒有緩衝,我們將不可避免的多次執行 A 的 getter!如果你不希望有緩衝,請用 method 替代。

1.5 計算屬性和Watch的比較

我們發現計算屬性會監聽依賴,如果依賴發生變化則會從新計算屬性,那麼【監聽器】也有這麼一個功能,那麼我們應該在什麼時候使用【計算屬性】,什麼時候使用【監聽器】呢?

<body>  <div id="app">    <h1>{{fullName}}</h1>  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      firstName: 'Jack',      lastName: 'Blue',      fullName: 'Jack Blue'    },    watch: {      firstName: function (val) {        this.fullName = val + ' ' + this.lastName      },      lastName: function (val) {        this.fullName = this.firstName + ' ' + val      }    }  })</script>

上面代碼中我們監聽firstName和lastName用於構建fullName,效果很好,當firstName和lastName任意一個值改變的時候fullName都會隨之改變。下面我們看一下計算屬性的寫法

<body>  <div id="app">    <h1>{{fullName}}</h1>    <!-- <h1>Jack Blue</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      firstName: 'Jack',      lastName: 'Blue',    },    computed: {      fullName() {        return this.firstName + ' ' + this.lastName      }    }  })</script>

上面代碼使用計算屬性的方式進行了改造,fullName 依賴 firstName和 lastName 兩個屬性,當這兩個屬性任意一個發生變化,fullname都會重新進行計算。但是計算屬性是不是簡潔了很多呢!

【總結!!】當一個屬性需要依賴多個【data】中的屬性時,建議使用計算屬性,如果我們不是對屬性進行操作,只是單純的依據【data】中的某個值變化後做一些【非屬性操作】時或者是在資料變化響應時,【執行非同步作業或開銷較大的操作】(比如:將變化後的值存入資料庫,而不是改變其他屬性)就使用Watch。

1.6 計算屬性的setter

上面我們是使用的計算屬性都是用於對計算屬性的取值,計算屬性預設頁只給了【getter】,但是在需要的時候我們可以人為的添加【setter】

<body>  <div id="app">    <h1>{{fullName}}</h1>    <!-- <h1>Jack Blue</h1> -->  </div></body><script>  let vm = new Vue({    el: "#app",    data: {      firstName: 'Jack',      lastName: 'Blue',    },    computed: {      fullName: {        //getter        get() {          return this.firstName + ' ' + this.lastName        },        //setter        set(newValue) {          var names = newValue.split(' ')          this.firstName = names[0]          this.lastName = names[names.length - 1]        }      }    }  })</script>

上面代碼定義了計算屬性的一個setter,注意當需要定義setter的時候文法上面是有區別的。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援幫客之家。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.