vue計算屬性的使用
我們有時候會在模板中綁定表達式來做簡單的數據處理,但是如果表達式太長,就會變得臃腫難以維護,比如
<div> {{text.split(',').reverse().join(',')}} </div>
表達式里面包含了3個操作,有時候可能會更加復雜,這時我們可以使用計算屬性。如下
<template> <div> {{reversedText}} </div> </template> <script> export default { data(){ return{ text: '123,456' } }, computed: { reversedText: function () { //這里的this指向的是當前的vue實例 return this.text.split(',').reverse().join(','); //如果這兩的text是后台接受的數據,最好加個判斷數據為不為空 } } } </script>
在一個計算屬性里可以完成各種復雜的邏輯,包括運算、函數調用等,只要最終返回一個結果就可以,計算屬性還可以依賴多個
數據,只要其中任何一個數據變動,計算都會重新執行。例如:
<template> <div> 總價:{{price}} </div> </template> <script> export default { data(){ return{ package1: [ { name: 'iPhoneX', price: 300, count: 1 }, { name: 'iPad', price: 100, count: 2 } ], package2: [ { name: 'apple', price: 2, count: 5 }, { name: 'orange', price: 1, count: 10 } ] } }, computed: { price: function () { var price = 0; for(var i = 0; i < this.package1.length; i++){ price += this.package1[i].price * this.package1[i].count } for(var i = 0; i < this.package2.length; i++){ price += this.package2[i].price * this.package2[i].count } return price; } } }
當package1或者package2中price和count有任何變動時,計算屬性都會price都會自動更新,視圖中的總價也會自動變動。
每個計算屬性都包含一個getter和setter,上面的例子都是計算屬性的默認用法,只是利用了getter來讀取。計算屬性提供的setter函數,當你手動修改計算屬性的值時,就可以觸發setter函數,執行一些操作。例如
<template> <div> 姓: {{firstName}}<br> 名: {{lastName}}<br> 姓名:{{fullName}} </div> </template> <script> export default { data(){ return{ firstName: 'wang', lastName: 'leilei' } }, computed: { fullName: { //getter用於讀取 get: function () { return this.firstName + ' ' + this.lastName; }, set: function (newValue) { var names = newValue.split(' '); this.firstName = names[0]; this.lastName = names[names.length - 1]; } } } } </script>
上面這個例子中,當改變fullName的值改變,this.fullName = "Jon Snow"; firstName和lastName的值也會跟着改變。
就算屬性還有兩個使用小技巧容易被忽略:一個是計算屬性可以依賴其他計算屬性;一個是計算屬性不僅可以依賴當前vue實例,還可以依賴其他實例的數據!