1. 程式人生 > 其它 >Vue.js-計算屬性和過濾器與監聽屬性/Vue.js元件

Vue.js-計算屬性和過濾器與監聽屬性/Vue.js元件

1、什麼是計算屬性
  
在Vue.js建構函式中定義資料使用data,該物件是對資料的代理,是一個鍵值對,並且實時與頁面的表現是一致的,但在這個物件中只能是簡單的鍵值對,不能擁有業務邏輯。由於“data”中的屬性屬於同-一個生命週期,所以如果需要某一個屬性是依賴於另外一個屬性時,在‘data”屬性中是做不到的。為了解決這個問題,Vue提供計算屬性來實現。

  在Vue.js建構函式的引數物件中有一個“computed",該物件就是用於定義計算屬性的,該物件中的“鍵”也就是計算屬性。與“data”不同的是,計算屬性的鍵值是一個擁有返回值的函式,該函式中可以訪問dat中的所有屬性。

  在一個計算屬性中可以完成各種複雜的邏輯,包括邏輯運算、函式呼叫等,只要最終返回一個結果即可。計算屬性可以依賴多個Vue例項的資料,只要其中有一個數據變化,計算

屬就會重新執行,檢視也會更新。

  computed:{

     prices:function(){

      var prices=0;

      for(var i=0;i<this.package1.length;i++){

        prices+=this.package1[i].price * this.package1[i].count;

       }

       return prices;

      }
    }

2、計算屬性與計算方法的區別

  computed:{

    areas:function(){

      let areas=0

      areas = this.length * this.width

      return areas

      }
    },

    methods:{

      add:function(){

      this.num=parseInt(this.length)+parseInt(this.width)

      },

    }

    在computed的方法中編寫的邏輯運算,在呼叫時直接將areas視為一個變數值使用,無須進行函式呼叫。computed具有級存功能,在系統初始執行的時候呼叫一次,當計算結果發

生變化時會再次被呼叫。例在上面程式碼中computed中的方法就會被呼叫。computed是計算屬性,呼叫時“areas"不需要括號。

    在methods的方法中編寫的邏輯運算,在呼叫時一-定要加括號,例如add()。methods中可以寫多個方法,並且這些方法在頁面初始載入時呼叫一次,以後只有使用程式程式碼呼叫時才會被執行。例在上面程式碼中單擊按鈕後,methods中的單擊事件方法才被呼叫一次。

    其實呼叫methods中的方法也能實現和計算屬性一樣的效果,甚至有的方法還能接收引數,使用起來更加靈活。既然使用計算方法就可以實現。

    那為什麼還需要計算屬性呢?這是因為計算屬性是基於依賴快取的,計算屬性依賴的資料發生變化時,才會重新取值,所以依賴的text只要不改變,計算屬性就不更新。計算方法則不同,只要重新渲染就會被呼叫,因此函式也會被執行。

    使用計算屬性還是計算方法取決於是否需要快取,如果做遍歷大陣列和做大量計算時,應當使用計算屬性。

3、計算屬性的setter

  每一個計算屬性都包含一個getter和setter。

    computed:{

      fullName:{
        get:function(){
          return this.firstName+ ' ' +this.lastName
          },
        set:function(){
          var name = newValue.split(' ');
          this.firstName=names[0];
          this.lastName=names[1];
          }
        }
      }

4、過濾器的定義

  過濾器(Filters)提供了--種執行文字轉換的方法,例如所有字母都轉換成大寫字母或者做任何想做的事情。過濾器與計算屬性(computed)、方法(methods)不同的是,過濾器不會修改資料,只是改變在網頁上的顯示形式。

過濾器可以用在兩個地方:插值表示式{}}和v-bind表示式,然後由管道操作符“|”進行指示,其語法格式如下:

{{message|過濾器名}}

<!--在v-bind中呼叫過濾器-->

<divv-bind:id="rawIdI過濾器名"></div>

   (1)、本地過濾器     

      filters:{
        changeCapitalLetter(value){
          if(value){
            let str=value.toString();
            let newArr=str.split(" ").map(ele=>{
              return ele.charAt(0).toUpperCase()+ele.slice(1)
            });
            return newArr.join(" ")
          }
        }
      }

    (2)、全域性過濾器     

      Vue.filter('number',function(value){
        return value <10?'0'+value:value
        })
        Vue.filter('numberFormat',function(value,n){
        return value.toFixed(n)
        })
          var app=new Vue({
                el:"#app",
                data:{
                  message:'Hello Vue!'
               },
              })

5、監聽屬性

  監聽屬性watch用來監聽指定屬性的變化,watch這個物件中都是函式,函式的名稱是data中的屬性名稱,watch中的函式不需要呼叫。屬性發生改變時就會觸發watch函式,每個函式都會接收兩個值,分別是新值和舊日值,可以在watch中根據新舊值的判斷來減少虛擬DOM的渲染。

    watch:{

      監聽的屬性名(新值,舊值){

      }

    }

Vue.js元件的建立

  使用Vue.extend配合Vue.component方法

    var com1 = Vue.extend{

        template:"<h3>使用Vue.extend建立元件</h3>"

      })

例如:

    var com1=Vue.extend({

        template:"<h3>使用vue.extend建立元件</h3>"

    })

    Vue.component('mycom',com1)

    var vm = new Vue({

          el:"#app",

          data:{

          },
        });