中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Vue3中的計算屬性及偵聽器怎么使用

發布時間:2022-08-02 10:42:53 來源:億速云 閱讀:187 作者:iii 欄目:開發技術

這篇文章主要介紹“Vue3中的計算屬性及偵聽器怎么使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Vue3中的計算屬性及偵聽器怎么使用”文章能幫助大家解決問題。

計算屬性

我們知道,在模板中可以直接通過插值語法顯示一些data中的數據,但是在某些情況,我們可能需要對數據進行一些轉化后再顯示,或者需要將多個數據結合起來進行顯示

在模板中使用表達式,可以非常方便的實現,但是設計它們的初衷是用于簡單的運算,在模板中放入太多的邏輯會讓模板過重和難以維護,并且如果多個地方都使用到,那么會有大量重復的代碼

所以我們希望將業務邏輯和UI界面進行分離,其中一種方式就是將邏輯抽取到一個method中,但這種做法有以下弊端

  • 所有的data使用過程都會變成了一個方法的調用

  • 多次獲取數據,需要多次調用方法,執行對應的邏輯,沒有緩存

事實上,對于任何包含響應式數據的復雜邏輯,你都應該使用計算屬性

<div id="app">
  <!-- 計算屬性的使用和普通狀態的使用方式是一致的 -->
  <h3>{{ fullname }}</h3>
</div>

<script>
  Vue.createApp({
    data() {
      return {
        firstname: 'Klaus',
        lastname: 'Wang'
      }
    },
    computed: {
      fullname() {
        return this.firstname + ' ' + this.lastname
      }
    }
  }).mount('#app')

緩存

計算屬性會基于它們的依賴關系進行緩存,在數據不發生變化時,計算屬性是不需要重新計算的

但是如果依賴的數據發生變化,在使用時,計算屬性依然會重新進行計算

并且界面會使用最新的計算屬性的值進行重新渲染

getter 和 setter

計算屬性在大多數情況下,只需要一個getter方法即可,所以我們會將計算屬性直接寫成一個函數

<div id="app">
  <!-- 計算屬性的使用和普通狀態的使用方式是一致的 -->
  <h3>{{ fullname }}</h3>
  <button @click="change">change</button>
</div>
<script>
  Vue.createApp({
    data() {
      return {
        firstname: 'Klaus',
        lastname: 'Wang'
      }
    },
    methods: {
      change() {
        this.fullname = 'Alex Li'
      }
    },
    computed: {
      // 計算屬性的完整寫法
      fullname: {
        get() {
          return this.firstname + ' ' + this.lastname
        },
        set(v) {
          this.firstname = v.split(' ')[0]
          this.lastname = v.split(' ')[1]
        }
      }
    }
  }).mount('#app')
</script>

偵聽器

在data返回的對象中定義了數據,這個數據通過插值語法等方式綁定到template中,當數據變化時,template會自動進行更新來顯示最新的數據

但是在某些情況下,我們希望在代碼邏輯中監聽某個數據的變化,這個時候就需要用偵聽器watch來完成了

Vue.createApp({
  data() {
    return {
      info: {
        name: 'Klaus'
      }
    }
  },
  watch: {
    // 可以使用watch監聽響應式數據的改變
    // 對應有兩個參數
    // 參數一 --- 新值
    // 參數二 --- 舊值
    info(newV, oldV) {
      // 如果監聽的值是對象,獲取到的新值和舊值是對應對象的代理對象
      console.log(newV, oldV)

      // 代理對象 轉 原生對象
      // 1. 使用淺拷貝獲取一個新的對象,獲取的新的對象為原生對象
      console.log({...newV})

      // 2. 使用Vue.toRaw方法獲取原生對象
      console.log(Vue.toRaw(newV))
    }
  },
  methods: {
    change() {
      this.info = {
        name: 'Steven'
      }
    }
  }
}).mount('#app')

配置選項

屬性說明
deep是否開啟深度監聽
值為boolean
未開啟的時候,如果監聽的是對象,那么只有對象的引用發生改變的時候,才會觸發watch回調
開始后,如果監聽的是對象,那么只要對象中的任意一個屬性發生了改變,就會觸發watch回調
immediate是否立即開始監聽
默認情況下,初次渲染是不會觸發watch監聽,只有當值發生改變后,才會觸發watch監聽
將immediate設置為true后,初次渲染也會觸發watch監聽,此時oldValue的值為undefined
Vue.createApp({
  data() {
    return {
      info: {
        name: 'Klaus'
      }
    }
  },
  watch: {
    info: {
      // 開啟了深度監聽后,當info的屬性發生改變的時候,就會觸發對應的watch回調
      // 注意: 和直接修改info引用不同的是,如果直接修改的是對象的屬性
      // 那么此時newV和oldV是同一個對象的引用, 此時也就獲取不到對應的舊值
      handler(newV, oldV) {
        console.log(newV, oldV)
        console.log(newV === oldV)  // => true
      },
      deep: true,
      immediate: true
    }
  },
  methods: {
    change() {
      this.info.name = 'Steven'
    }
  }
}).mount('#app')

其它寫法

直接監聽對象屬性

watch: {
  'info.name'(newV, oldV){
    console.log(newV, oldV)
  }
}

字符串寫法

Vue.createApp({
  data() {
    return {
      info: {
        name: 'Klaus'
      }
    }
  },
  watch: {
    // watch的值如果是一個字符串的時候
    // 會自動以該字符串作為函數名去methods中查找對應的方法
    'info.name': 'watchHandler'
  },
  methods: {
    change() {
      this.info.name = 'Steven'
    },
    watchHandler(newV, oldV){
      console.log(newV, oldV)
    }
  }
}).mount('#app')

數組寫法

Vue.createApp({
  data() {
    return {
      info: {
        name: 'Klaus'
      }
    }
  },
  watch: {
    'info.name': [
      'watchHandler',

      function handle() {
        console.log('handler2')
      },

      {
        handler() {
          console.log('handler3')
        }
      }
    ]
  },
  methods: {
    change() {
      this.info.name = 'Steven'
    },
    watchHandler(){
      console.log('handler1')
    }
  }
}).mount('#app')

$watch

Vue.createApp({
  data() {
    return {
      info: {
        name: 'Klaus'
      }
    }
  },
  created() {
    /*
          $watch 參數列表
            參數一 --- 偵聽源
            參數二 --- 偵聽回調
            參數三 --- 配置對象
        */
    this.$watch('info.name', (newV, oldV) => console.log(newV, oldV), {
      immediate: true
    })
  },
  methods: {
    change() {
      this.info.name = 'Steven'
    }
  }
}).mount('#app')

關于“Vue3中的計算屬性及偵聽器怎么使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

堆龙德庆县| 蒙自县| 九寨沟县| 邻水| 南召县| 宿松县| 克拉玛依市| 林西县| 娱乐| 宣恩县| 二连浩特市| 东乡族自治县| 象州县| 海宁市| 临朐县| 南汇区| 武宁县| 海阳市| 大悟县| 九龙坡区| 当雄县| 天水市| 临夏市| 正定县| 沛县| 太谷县| 鄯善县| 万宁市| 香格里拉县| 武川县| 温宿县| 道孚县| 江山市| 德令哈市| 普定县| 敦化市| 通榆县| 吴旗县| 将乐县| 修文县| 视频|