vue 知識點整理——過濾器(filter)、計算屬性(computed)、方法(method)、監(jiān)聽器(watch)

過濾器

概念:Vue.js 允許你自定義過濾器,可被用作一些常見的文本格式化。過濾器可以用在兩個地方:mustache 插值和 v-bind 表達式。過濾器應(yīng)該被添加在 JavaScript 表達式的尾部,由“管道”符指示;

私有過濾器

  1. HTML元素:

<td>{{item.ctime | dataFormat('yyyy-mm-dd')}}</td>

  1. 私有 filters 定義方式:

filters: { // 私有局部過濾器,只能在 當(dāng)前 VM 對象所控制的 View 區(qū)域進行使用

    dataFormat(input, pattern = "") { // 在參數(shù)列表中 通過 pattern="" 來指定形參默認值,防止報錯

      var dt = new Date(input);

      // 獲取年月日

      var y = dt.getFullYear();

      var m = (dt.getMonth() + 1).toString().padStart(2, '0');

      var d = dt.getDate().toString().padStart(2, '0');



      // 如果 傳遞進來的字符串類型,轉(zhuǎn)為小寫之后,等于 yyyy-mm-dd,那么就返回 年-月-日

      // 否則,就返回  年-月-日 時:分:秒

      if (pattern.toLowerCase() === 'yyyy-mm-dd') {

        return `${y}-${m}-$u0z1t8os`;

      } else {

        // 獲取時分秒

        var hh = dt.getHours().toString().padStart(2, '0');

        var mm = dt.getMinutes().toString().padStart(2, '0');

        var ss = dt.getSeconds().toString().padStart(2, '0');



        return `${y}-${m}-$u0z1t8os ${hh}:${mm}:${ss}`;

      }

    }

  }

使用ES6中的字符串新方法 String.prototype.padStart(maxLength, fillString='') 或 String.prototype.padEnd(maxLength, fillString='')來填充字符串;

全局過濾器


// 定義一個全局過濾器

Vue.filter('dataFormat', function (input, pattern = '') {

  var dt = new Date(input);

  // 獲取年月日

  var y = dt.getFullYear();

  var m = (dt.getMonth() + 1).toString().padStart(2, '0');

  var d = dt.getDate().toString().padStart(2, '0');



  // 如果 傳遞進來的字符串類型,轉(zhuǎn)為小寫之后,等于 yyyy-mm-dd,那么就返回 年-月-日

  // 否則,就返回  年-月-日 時:分:秒

  if (pattern.toLowerCase() === 'yyyy-mm-dd') {

    return `${y}-${m}-$u0z1t8os`;

  } else {

    // 獲取時分秒

    var hh = dt.getHours().toString().padStart(2, '0');

    var mm = dt.getMinutes().toString().padStart(2, '0');

    var ss = dt.getSeconds().toString().padStart(2, '0');



    return `${y}-${m}-$u0z1t8os ${hh}:${mm}:${ss}`;

  }

});

注意:當(dāng)有局部和全局兩個名稱相同的過濾器時候,會以就近原則進行調(diào)用,即:局部過濾器優(yōu)先于全局過濾器被調(diào)用!

computed 計算屬性:

模板內(nèi)的表達式非常便利,但是設(shè)計它們的初衷是用于簡單運算的。在模板中放入太多的邏輯會讓模板過重且難以維護。計算屬性的結(jié)果會被緩存,除非依賴的響應(yīng)式屬性變化才會重新計算。

示例:
    <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: { // 計算屬性computed是一個對象
        // 計算屬性的 getter
        reversedMessage: function () {
          // `this` 指向 vm 實例
          return this.message.split('').reverse().join('')
        }
      }
    })

計算屬性和方法的區(qū)別:

你可能已經(jīng)注意到我們可以通過在表達式中調(diào)用方法來達到同樣的效果:

<p>Reversed message: "{{ reversedMessage() }}"</p>
// 在組件中
methods: {
  reversedMessage: function () {
    return this.message.split('').reverse().join('')
  }
}

計算屬性可以緩存,只要 message 還沒有發(fā)生改變,多次訪問 reversedMessage 計算屬性會立即返回之前的計算結(jié)果,而不必再次執(zhí)行函數(shù)。

計算屬性和監(jiān)聽屬性watch的區(qū)別:

  • watch擅長處理的場景:一個數(shù)據(jù)影響多個數(shù)據(jù)
  • computed擅長處理的場景:一個數(shù)據(jù)受多個數(shù)據(jù)影響
  <div id="app">
      <div>{{ fullName }}</div>
  </div>

var vm = new Vue({
  el: '#app',
  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
    }
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})

methods(方法):

methods 將被混入到 Vue 實例中。可以直接通過 VM 實例訪問這些方法,或者在指令表達式中使用。方法中的 this 自動綁定為 Vue 實例。

不應(yīng)該使用箭頭函數(shù)來定義 method 函數(shù) (例如 plus: () => this.a++)。理由是箭頭函數(shù)綁定了父級作用域的上下文,所以 this 將不會按照期望指向 Vue 實例,this.a 將是 undefined。

示例:
  <style>
    .box{
      width: 100px;
      height: 100px;
      background-color: aquamarine;
    }
  </style>

  <div id="app">
      <p>{{a}}</p>
      <div class="box" @click="plus"></div>
  </div>

  <script>
    var vm = new Vue({
      el: '#app',
      data: { a: 1 },
      methods: {
        plus: function () {
          this.a++
        }
      }
    })
  </script>

watch(偵聽屬性):

一個對象,鍵是需要觀察的表達式,值是對應(yīng)回調(diào)函數(shù)。監(jiān)聽數(shù)據(jù)的變化,數(shù)據(jù)變化就會觸發(fā)回調(diào)函數(shù)。

不應(yīng)該使用箭頭函數(shù)來定義 method 函數(shù) (例如 plus: () => this.a++)。理由是箭頭函數(shù)綁定了父級作用域的上下文,所以 this 將不會按照期望指向 Vue 實例,this.a 將是 undefined。

示例:
  <style>
    .box{
      width: 100px;
      height: 100px;
      background-color: aquamarine;
    }
  </style>

  <div id="app">
      <p>{{a}}</p>
      <div class="box" @click="plus"></div>
  </div>

  <script>
    var vm = new Vue({
      el: '#app',
      data: { a: 1 },
      methods: {
        plus: function () {
          this.a++
        }
      },
      watch: {
        a:function () {
          console.log(`檢測到數(shù)據(jù)變化了${this.a - 1}次!`)
        }
      }
    })
  </script>

不應(yīng)該使用箭頭函數(shù)來定義 watcher 函數(shù) (例如 searchQuery: newValue => this.updateAutocomplete(newValue))。理由是箭頭函數(shù)綁定了父級作用域的上下文,所以 this 將不會按照期望指向 Vue 實例,this.updateAutocomplete 將是 undefined。

最后編輯于
?著作權(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)容

  • # 傳智播客vue 學(xué)習(xí)## 1. 什么是 Vue.js* Vue 開發(fā)手機 APP 需要借助于 Weex* Vu...
    再見天才閱讀 3,802評論 0 6
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,186評論 0 29
  • 1. Vue 實例 1.1 創(chuàng)建一個Vue實例 一個 Vue 應(yīng)用由一個通過 new Vue 創(chuàng)建的根 Vue 實...
    王童孟閱讀 1,096評論 0 2
  • 主要還是自己看的,所有內(nèi)容來自官方文檔。 介紹 Vue.js 是什么 Vue (讀音 /vju?/,類似于 vie...
    Leonzai閱讀 3,555評論 0 25
  • 從去年六月份畢業(yè)到現(xiàn)在,大半年的時間里我一直處在一個所謂的迷茫期之中。也許我并沒有懂迷茫真正的含義,但我將自...
    努力少女閱讀 240評論 1 3

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