最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue監(jiān)聽屬性watch的用法及使用場景詳解

 更新時間:2025年09月25日 11:39:28   作者:沖浪的鵬多多  
watch是vue中常用的監(jiān)聽器,它主要用于偵聽數據的變化,在數據發(fā)生變化的時候執(zhí)行一些操作,這篇文章主要介紹了vue監(jiān)聽屬性watch的用法及使用場景的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

1. 監(jiān)聽屬性 watch

watch 是一個對象,鍵是需要觀察的表達式,用于觀察 Vue 實例上的一個表達式或者一個函數計算結果的變化。回調函數的參數是新值和舊值。值也可以是方法名,或者包含選項的對象。Vue 實例將會在實例化時調用 $watch(),遍歷 watch 對象的每一個 property。

2. 常規(guī)用法

watch 監(jiān)聽有兩個形參,第一個是新值,第二個是舊值。如下例子:使用 watch 監(jiān)聽了 total 的值,當 total 的值改變時,控制臺會打印出舊值和新值。

<template>
  <div class="home_box">
    <h1>{{ total }}</h1>
    <button @click="handleAddTotal">增加</button>
  </div>
</template>

<script>
export default {
  name: 'Home',
  watch: {
    total(newValue, oldValue) {
      console.log('舊值:', oldValue)
      console.log('新值:', newValue)
    }
  },
  data() {
    return {
      total: 0
    }
  },
  methods: {
    handleAddTotal() {
      this.total++
    }
  }
}
</script>

3. 監(jiān)聽對象和route變化

watch監(jiān)聽的目標,可以是基本類型,也可以是對象,也可以是對象里的一個值。而監(jiān)聽目標的屬性,可以是一個函數,也可以是一個包含handler(回調函數),immediate(是否初始化后立即執(zhí)行一次)和deep(是否開啟深度監(jiān)聽)的對象。

<script>
export default {
  name: 'Home',
  watch: {
    // 監(jiān)聽基本類型
    aaa(newValue, oldValue) {
      console.log('舊值:', oldValue)
      console.log('新值:', newValue)
    },
    // 監(jiān)聽基本類型,并且回調函數寫在methods里,且初始化加載立即執(zhí)行一次
    bbb: {
      handler: 'handleBBB',
      immediate: true
    },
    // 監(jiān)聽對象類型,需要開啟深度監(jiān)聽
    ccc: {
      handler: (newValue, oldValue) {
        console.log('舊值:', oldValue)
        console.log('新值:', newValue)
      },
      deep: true
    },
    // 監(jiān)聽對象里的某個值
    'ddd.d2.d21': {
      handler: (newValue, oldValue) {
        console.log('舊值:', oldValue)
        console.log('新值:', newValue)
      }
    },
    // 監(jiān)聽route變化
    '$route': {
      handler: (newValue, oldValue) {
        console.log('舊值:', oldValue)
        console.log('新值:', newValue)
      }
    }
  },
  data() {
    return {
      aaa: 0,
      bbb: 0,
      ccc: {
        c1: 0,
        c2: 0
      },
      ddd: {
        d1: 0,
        d2: {
          d21: 0
        }
      }
    }
  },
  methods: {
    handleBBB() {
      this.bbb++
    }
  }
}
</script>

4. 使用場景

watch監(jiān)聽屬性使用場景很多。比如:

  1. 即時表單驗證
  2. 搜索
  3. 監(jiān)聽數據變化,做出相應改變

如下例子,監(jiān)聽 keyword 的值,實時打印出來。

<template>
  <div class="home_box">
    <input type="text" v-model="keyword">
  </div>
</template>

<script>
export default {
  name: 'Home',
  watch: {
    keyword: {
      handler: 'handleKeywordChange'
    }
  },
  data() {
    return {
      keyword: '',
    }
  },
  methods: {
    handleKeywordChange(newValue, oldValue) {
      console.log(newValue, oldValue)
    }
  }
}
</script>

附Watch 的高級用法

深度監(jiān)聽數據的變化

在 Vue 中,深度監(jiān)聽數據的變化意味著不僅監(jiān)聽對象或數組本身的變化,還監(jiān)聽它們內部屬性或元素的變化。

當將deep選項設置為true時,Vue 會遞歸遍歷對象的所有屬性或數組的所有元素,并為每個屬性或元素都創(chuàng)建一個深度觀察者。這樣,無論是對象的某個屬性還是數組的某個元素發(fā)生變化,都能觸發(fā)相應的回調函數。

使用深度監(jiān)聽來監(jiān)聽對象屬性的變化如下所示:

watch: {
  'obj.foo': {
    handler(newVal, oldVal) {
      console.log('obj.foo屬性發(fā)生變化了,新值為:', newVal, '舊值為:', oldVal);
    },
    deep: true // 深度監(jiān)聽
  }
}

在上述示例中,obj是一個對象,foo是它的一個屬性。當objfoo發(fā)生變化時,都能觸發(fā)深度觀察者的回調函數。

因此,通過在 Vue 的watch選項中將deep選項設置為true,可以實現對對象屬性或數組元素的深度監(jiān)聽,從而捕捉到它們內部值的變化。

注意:深度監(jiān)聽會帶來一些性能開銷,因為它需要遞歸遍歷對象或數組的所有屬性或元素。因此,只在需要深度監(jiān)聽的情況下使用,以避免不必要的開銷。

還需要特別注意的是,深度監(jiān)聽僅適用于對象和數組,對于基本類型的數據如字符串、數字等是不起作用的。

立即執(zhí)行 Watch 回調函數

在 Vue 中,watch 選項的回調函數默認是在被監(jiān)聽的數據發(fā)生變化后異步執(zhí)行的,即在下一次事件循環(huán)中執(zhí)行。

然而,有時我們可能需要立即響應數據變化,并在變化發(fā)生后立即執(zhí)行回調函數。為了實現這一需求,Vue 提供了immediate選項。

當在 watch 選項中設置immediate: true時,Vue 會在監(jiān)聽開始之初立即執(zhí)行回調函數,無論數據是否已經發(fā)生變化。

使用immediate選項來實現立即執(zhí)行 watch 回調函數的效果如下所示:

watch: {
  foo: {
    handler(newVal, oldVal) {
      console.log('foo屬性發(fā)生變化了,新值為:', newVal, '舊值為:', oldVal);
    },
    immediate: true // 立即執(zhí)行
  }
}

在上述示例中,當 Vue 實例創(chuàng)建時,會立即執(zhí)行一次foo屬性的 watch 回調函數,無論foo的值是否已經發(fā)生變化。隨后,如果foo發(fā)生變化,Vue 會在下一次事件循環(huán)中再次執(zhí)行 watch 回調函數。

總之,通過在 Vue 的 watch 選項中設置immediate: true,可以立即執(zhí)行 watch 回調函數,不等待數據的真正變化。這在某些情況下可以用于立即響應數據變化并執(zhí)行相關操作的需求。

注意:當設置immediate: true時,回調函數會在監(jiān)聽開始時立即執(zhí)行一次,并且不會等待偵聽的數據屬性的真正變化。這意味著你可能無法獲得先前的值,因為此時回調函數仍然是在數據變化之前執(zhí)行的。

總結

到此這篇關于vue監(jiān)聽屬性watch的用法及使用場景的文章就介紹到這了,更多相關vue監(jiān)聽屬性watch內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解vue中v-bind:style效果的自定義指令

    詳解vue中v-bind:style效果的自定義指令

    這篇文章主要介紹了vue中v-bind:style效果的自定義指令,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • Vue優(yōu)化大批量接口請求的實戰(zhàn)指南

    Vue優(yōu)化大批量接口請求的實戰(zhàn)指南

    在Vue項目開發(fā)中,大批量接口請求是常見場景,本文結合Vue2/Vue3實戰(zhàn),從請求管控,緩存策略,代碼優(yōu)化和異常處理四大維度,提供可直接落地的優(yōu)化方案,覆蓋核心場景與避坑要點,希望對大家有所幫助
    2026-04-04
  • Vue3中v-if和v-for優(yōu)先級實例詳解

    Vue3中v-if和v-for優(yōu)先級實例詳解

    Vue.js中使用最多的兩個指令就是v-if和v-for,下面這篇文章主要給大家介紹了關于Vue3中v-if和v-for優(yōu)先級的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • vue通過vue-lazyload實現圖片懶加載的代碼詳解

    vue通過vue-lazyload實現圖片懶加載的代碼詳解

    這篇文章主要給大家介紹了vue通過vue-lazyload實現圖片懶加載,文中通過代碼示例給大家介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • Vue params傳參刷新網頁數據丟失的解決方法

    Vue params傳參刷新網頁數據丟失的解決方法

    本文討論了在Vue中實現刷新網頁不丟失數據同時隱藏URL參數的方法,通過結合瀏覽器刷新不觸發(fā)生命周期函數和使用localStorage或sessionStorage技術,解決了刷新丟失數據的問題,同時介紹了Vue Router中的props屬性的應用場景與方法,需要的朋友可以參考下
    2026-04-04
  • vue使用el-table動態(tài)合并列及行

    vue使用el-table動態(tài)合并列及行

    這篇文章主要為大家詳細介紹了vue使用el-table動態(tài)合并列及行,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • vue面試之new Vue的時候到底做了什么

    vue面試之new Vue的時候到底做了什么

    這篇文章主要介紹了vue面試之new Vue的時候到底做了什么原理及vue加載流程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • 關于Vue.js一些問題和思考學習筆記(1)

    關于Vue.js一些問題和思考學習筆記(1)

    這篇文章主要為大家分享了關于Vue.js一些問題和思考的學習筆記,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • vue實現路由鑒權和不同用戶登錄

    vue實現路由鑒權和不同用戶登錄

    這篇文章主要為大家詳細介紹了vue中實現路由鑒權和不同用戶登錄的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-04-04
  • vue中用H5實現文件上傳的方法實例代碼

    vue中用H5實現文件上傳的方法實例代碼

    本篇文章主要介紹了vue中用H5實現文件上傳的方法實例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論

九龙城区| 乌拉特后旗| 大姚县| 巩义市| 彭州市| 恭城| 瓦房店市| 天镇县| 鄂伦春自治旗| 潞西市| 汕尾市| 当雄县| 天峻县| 河东区| 祁阳县| 封丘县| 锡林郭勒盟| 万安县| 平潭县| 葵青区| 石阡县| 锡林浩特市| 高州市| 临桂县| 施秉县| 乌拉特后旗| 徐水县| 无为县| 灵川县| 夹江县| 都江堰市| 汶川县| 新宁县| 姜堰市| 丰原市| 阿勒泰市| 达州市| 获嘉县| 山东省| 彭阳县| 武强县|