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

Vue基礎(chǔ)之偵聽(tīng)器詳解

 更新時(shí)間:2021年12月06日 16:22:38   作者:DomCode  
這篇文章主要為大家介紹了Vue基礎(chǔ)之偵聽(tīng)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

vue中什么是偵聽(tīng)器

  • 開(kāi)發(fā)中我們?cè)赿ata返回的對(duì)象中定義了數(shù)據(jù),這個(gè)數(shù)據(jù)可以通過(guò)插值語(yǔ)法等方式綁定到templat中。
  • 當(dāng)數(shù)據(jù)變化的時(shí)候,template里綁定的數(shù)據(jù)會(huì)自動(dòng)進(jìn)行更新來(lái)顯示最新的數(shù)據(jù)。但是這種變化是在template中自動(dòng)偵聽(tīng)data的值來(lái)進(jìn)行變換的
  • 在某些情況下,我們希望在代碼邏輯中監(jiān)聽(tīng)某個(gè)數(shù)據(jù)的變化,這個(gè)時(shí)候就需要用到偵聽(tīng)器watch了

官方定義:Vue 通過(guò) watch 選項(xiàng)提供了一個(gè)更通用的方法,來(lái)響應(yīng)數(shù)據(jù)的變化。當(dāng)需要在數(shù)據(jù)變化時(shí)執(zhí)行異步或開(kāi)銷較大的操作時(shí),這個(gè)方式是最有用的。

一個(gè)對(duì)象,鍵是要偵聽(tīng)的響應(yīng)式 property——包含了 data 或 computed property,而值是對(duì)應(yīng)的回調(diào)函數(shù)。值也可以是方法名,或者包含額外選項(xiàng)的對(duì)象。組件實(shí)例將會(huì)在實(shí)例化時(shí)調(diào)用 $watch(),參閱 $watch,以了解更多關(guān)于 deep、immediate 和 flush 選項(xiàng)的信息

偵聽(tīng)器的用法

選項(xiàng):watch

類型:{ [key: string]: string | Function | Object | Array}

偵聽(tīng)器watch的配置選項(xiàng):

默認(rèn)情況下,watch只是在偵聽(tīng)數(shù)據(jù)的引用變化,對(duì)于數(shù)據(jù)內(nèi)部屬性的變化是不會(huì)做出響應(yīng)的:

這個(gè)時(shí)候我們可以使用一個(gè)選項(xiàng)deep進(jìn)行更深層的偵聽(tīng);另外一個(gè)屬性,是希望一開(kāi)始的就會(huì)立即執(zhí)行一次:這個(gè)時(shí)候我們使用immediate選項(xiàng);這個(gè)時(shí)候無(wú)論后面數(shù)據(jù)是否有變化,偵聽(tīng)的函數(shù)都會(huì)有限執(zhí)行一次;

data的內(nèi)容:

data() {
    return {
        info: {
            name: 'cgj'
        }
    }
}
watch: {
    info: {
        handler(newValue, oldValue) {
            console.log(newValue, oldValue)    
        }
        deep: true,
        immediate: true,
    }
}

另外一個(gè)是Vue3文檔中沒(méi)有提到的,但是Vue2文檔中有提到的是偵聽(tīng)對(duì)象的屬性:

'info.name': function(newValue, oldValue) {
    console.log(newValue, oldValue)
}

還有另外一種方式就是使用 $watch 的API:

具體$watch可以查看官方的API查看(用的方式比較少):實(shí)例方法 | Vue.js

const app = createApp({
  data() {
    return {
      a: 1,
      b: 2,
      c: {
        d: 4
      },
      e: 5,
      f: 6
    }
  },
  watch: {
    // 偵聽(tīng)頂級(jí) property
    a(val, oldVal) {
      console.log(`new: ${val}, old: ${oldVal}`)
    },
    // 字符串方法名
    b: 'someMethod',
    // 該回調(diào)會(huì)在任何被偵聽(tīng)的對(duì)象的 property 改變時(shí)被調(diào)用,不論其被嵌套多深
    c: {
      handler(val, oldVal) {
        console.log('c changed')
      },
      deep: true
    },
    // 偵聽(tīng)單個(gè)嵌套 property
    'c.d': function (val, oldVal) {
      // do something
    },
    // 該回調(diào)將會(huì)在偵聽(tīng)開(kāi)始之后被立即調(diào)用
    e: {
      handler(val, oldVal) {
        console.log('e changed')
      },
      immediate: true
    },
    // 你可以傳入回調(diào)數(shù)組,它們會(huì)被逐一調(diào)用
    f: [
      'handle1',
      function handle2(val, oldVal) {
        console.log('handle2 triggered')
      },
      {
        handler: function handle3(val, oldVal) {
          console.log('handle3 triggered')
        }
        /* ... */
      }
    ]
  },
  methods: {
    someMethod() {
      console.log('b changed')
    },
    handle1() {
      console.log('handle 1 triggered')
    }
  }
})
const vm = app.mount('#app')
vm.a = 3 // => new: 3, old: 1

vue偵聽(tīng)器-watch

目標(biāo): 可以偵聽(tīng)data/computed屬性值改變

語(yǔ)法:

watch: {
    "被偵聽(tīng)的屬性名" (newVal, oldVal){
    }
}

例子代碼:

<template>
  <div>
    <input type="text" v-model="name">
  </div>
</template>
<script>
export default {
  data(){
    return {
      name: ""
    }
  },
  // 目標(biāo): 偵聽(tīng)到name值的改變
  /*
  語(yǔ)法:
    watch: {
      變量名 (newVal, oldVal){
        // 變量名對(duì)應(yīng)值改變這里自動(dòng)觸發(fā)
      }
    }
  */
  watch: {
    // newVal: 當(dāng)前最新值
    // oldVal: 上一刻值
    name(newVal, oldVal){
      console.log(newVal, oldVal);
    }
  }
}
</script>
<style>
</style>

小結(jié): 想要偵聽(tīng)一個(gè)屬性變化, 可使用偵聽(tīng)屬性watch

vue偵聽(tīng)器-深度偵聽(tīng)和立即執(zhí)行

目標(biāo): 可以偵聽(tīng)data/computed屬性值改變

語(yǔ)法:

watch: {
    "被偵聽(tīng)的屬性名" (newVal, oldVal){
    }
}

例子代碼:

<template>
  <div>
    <input type="text" v-model="user.name">
    <input type="text" v-model="user.age">
  </div>
</template>
<script>
export default {
  data(){
    return {
      user: {
        name: "",
        age: 0
      }
    }
  },
  // 目標(biāo): 偵聽(tīng)對(duì)象
  /*
  語(yǔ)法:
    watch: {
      變量名 (newVal, oldVal){
        // 變量名對(duì)應(yīng)值改變這里自動(dòng)觸發(fā)
      },
      變量名: {
        handler(newVal, oldVal){
        },
        deep: true, // 深度偵聽(tīng)(對(duì)象里面層的值改變)
        immediate: true // 立即偵聽(tīng)(網(wǎng)頁(yè)打開(kāi)handler執(zhí)行一次)
      }
    }
  */
  watch: {
    user: {
      handler(newVal, oldVal){
        // user里的對(duì)象
        console.log(newVal, oldVal);
      },
      deep: true,
      immediate: true
    }
  }
}
</script>
<style>
</style>

小結(jié): immediate立即偵聽(tīng), deep深度偵聽(tīng), handler固定方法觸發(fā)

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

最新評(píng)論

鄱阳县| 高邑县| 黄山市| 万载县| 常熟市| 武城县| 龙里县| 锦屏县| 虎林市| 皮山县| 武邑县| 林甸县| 秦皇岛市| 苏尼特右旗| 邵阳县| 永泰县| 宝山区| 余姚市| 成安县| 外汇| 张掖市| 揭阳市| 南部县| 乌拉特中旗| 揭西县| 翼城县| 兴义市| 布拖县| 东台市| 平邑县| 武安市| 阿鲁科尔沁旗| 白河县| 固阳县| 奎屯市| 米易县| 南宁市| 九龙城区| 三门县| 河北区| 咸丰县|