国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

vue計算屬性及使用詳解

2019-11-19 14:04:31
字體:
來源:轉載
供稿:網友

一、什么是計算屬性

模板內的表達式非常便利,但是設計它們的初衷是用于簡單運算的。在模板中放入太多的邏輯會讓模板過重且難以維護。例如:

<div id="example"> {{ message.split('').reverse().join('') }}</div>

這里的表達式包含3個操作,并不是很清晰,所以遇到復雜邏輯時應該使用Vue特帶的計算屬性computed來進行處理。

 二、計算屬性的用法

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

我們把上面的例子用計算屬性的方式重寫一下

<div id="example"> <p>Original message: "{{ message }}"</p> <p>Computed reversed message: "{{ reversedMessage }}"</p>  //我們把復雜處理放在了計算屬性里面了</div>var vm = new Vue({  el: '#example',  data: {    message: 'Hello'  },  computed: {    reversedMessage: function () {      // `this` 指向 vm 實例      return this.message.split('').reverse().join('')    }  }});

結果:

Original message: "Hello"

Computed reversed message: "olleH"

 除了上例簡單的用法,計算屬性還可以依賴多個Vue 實例的數據,只要其中任一數據變化,計算屬性就會重新執行,視圖也會更新。

<body>  <div id="app">    <button @click="add()">補充貨物1</button>    <div>總價為:{{price}}</div>  </div></body>var app = new Vue({        el: '#app',   data: {    package1: {      count: 5,      price: 5    },    package2: {      count: 10,      price: 10    }  },  computed: {   price: function(){     return this.package1.count*this.package1.price+this.package2.count*this.package2.price  //總價隨著貨物或價格的改變會重新計算   }  },  methods: {  //對象的方法    add: function(){      this.package1.count++    }  }});

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

 <div id="app1"></div>  <div id="app2">{{ reverseText}}</div>var app1 = new Vue({  el: '#app1', data: {   text: 'computed'  }});var app2 = new Vue({  el: '#app2',  computed: {    reverseText: function(){      return app1.text.split('').reverse().join(''); //使用app1的數據進行計算    }  }});

每一個計算屬性都包含一個getter 和一個setter ,我們上面的兩個示例都是計算屬性的默認用法, 只是利用了getter 來讀取。

在你需要時,也可以提供一個setter 函數, 當手動修改計算屬性的值就像修改一個普通數據那樣時,就會觸發setter 函數,執行一些自定義的操作,例如:

var vm = new Vue({  el: '#demo',  data: {    firstName: 'Foo',    lastName: 'Bar'  },  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];      }    }  }});//現在再運行 vm.fullName = 'John Doe' 時,setter 會被調用,vm.firstName 和 vm.lastName 也會相應地被更新。

絕大多數情況下,我們只會用默認的getter 方法來讀取一個計算屬性,在業務中很少用到setter,所以在聲明一個計算屬性時,可以直接使用默認的寫法,不必將getter 和setter 都聲明。

 三、計算屬性緩存

上面的例子,除了使用計算屬性外,我們也可以通過在表達式中調用方法來達到同樣的效果,如:

<div>{{reverseTitle()}}</div>// 在組件中methods: { reverseTitle: function () {  return this.title.split('').reverse().join('') }}

我們可以將同一函數定義為一個方法而不是一個計算屬性,兩種方式的最終結果確實是完全相同的。只是一個使用reverseTitle()取值,一個使用reverseTitle取值。

然而,不同的是計算屬性是基于它們的依賴進行緩存的。計算屬性只有在它的相關依賴發生改變時才會重新求值。

這就意味著只要 title還沒有發生改變,多次訪問 reverseTitle計算屬性會立即返回之前的計算結果,而不必再次執行函數。

舉個小例子:    

<div>{{reverseTitle}}</div>    <div>{{reverseTitle1()}}</div>    <button @click="add()">補充貨物1</button>    <div>總價為:{{price}}</div>  computed: {   reverseTitle: function(){     return this.title.split('').reverse().join('')  //而使用計算屬性,只要title沒變,頁面渲染是不會重新進這里來計算的,而是使用了緩存。   },   price: function(){     return this.package1.count*this.package1.price+this.package2.count*this.package2.price   }  },  methods: {  //對象的方法    add: function(){      this.package1.count++    },    reverseTitle1: function(){      return this.title.split('').reverse().join('')  //點擊補充貨物,也會進這個方法,再次計算。不是刷新,而是只要頁面渲染,就會進方法里重新計算。    }  },

相比之下,每當觸發重新渲染時,調用方法將總會再次執行函數。

我們為什么需要緩存?假設我們有一個性能開銷比較大的的計算屬性 A,它需要遍歷一個巨大的數組并做大量的計算。然后我們可能有其他的計算屬性依賴于 A 。

如果沒有緩存,我們將不可避免的多次執行 A 的 getter!如果你不希望有緩存,請用方法來替代。

下面看下Vue計算屬性的使用

<!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>計算屬性</title>  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">  <meta name="apple-mobile-web-app-capable" content="yes">  <meta name="apple-mobile-web-app-status-bar-style" content="black">  <script src="../js/Vue.js"></script>  <script src="../js/vue-resource.js"></script>  <script>    window.onload = function(){      var vm = new Vue({        el:'#box',        data: {          a: 1,        },        computed:{          b:function(){            return this.a+1;          }        }      });      console.log(vm.a);    }  </script></head><body><div id="box">  a => {{a}}  <br>  b => {{b}}</div></body></html><!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>計算屬性</title>  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">  <meta name="apple-mobile-web-app-capable" content="yes">  <meta name="apple-mobile-web-app-status-bar-style" content="black">  <script src="../js/Vue.js"></script>  <script src="../js/vue-resource.js"></script>  <script>    window.onload = function(){      var vm = new Vue({        el:'#box',        data: {          a: 1,        },        computed:{          b:function(){            return this.a+1;          }        }      });      document.onclick = function(){        vm.a = 101;      }    }  </script></head><body><div id="box">  a => {{a}}  <br>  b => {{b}}</div></body></html><!DOCTYPE html><html lang="en"><head>  <meta charset="UTF-8">  <title>計算屬性</title>  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">  <meta name="apple-mobile-web-app-capable" content="yes">  <meta name="apple-mobile-web-app-status-bar-style" content="black">  <script src="../js/Vue.js"></script>  <script src="../js/vue-resource.js"></script>  <script>    window.onload = function(){      var vm = new Vue({        el:'#box',        data: {          a: 1,        },        computed:{          b:{            get:function(){              return this.a+2;            },            set:function(val){              this.a=val;            }          }        }      });      document.onclick = function(){        vm.b = 10;      }    }  </script></head><body><div id="box">  a => {{a}}  <br>  b => {{b}}</div></body></html>

總結

以上所述是小編給大家介紹的vue計算屬性及使用詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 库尔勒市| 乐清市| 土默特右旗| 奇台县| 彰武县| 淮安市| 卓资县| 红原县| 夏津县| 丘北县| 蓝山县| 清镇市| 石渠县| 西峡县| 湟中县| 屏山县| 仙居县| 南平市| 巴东县| 内黄县| 阿拉善左旗| 富民县| 安义县| 霍林郭勒市| 大同市| 伊川县| 萨迦县| 昌图县| 冷水江市| 虹口区| 兴宁市| 若羌县| 永城市| 贡嘎县| 榕江县| 丰顺县| 津南区| 隆子县| 贡山| 新津县| 乌兰察布市|