浅谈vue中的事件监听器

383 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

前言

事件监听器(watch)一直是vue的一个重要组成部分,主要作用是监听data中的数据的变化,当data中的数据改变时就会触发 watch,我们可以进行一系列监听回调操作

vue2中的watch

在vue2中,watch属性功能及写法如下:

 watch: {
         deep: true,
         immediate:true,
         value: {
           handler (newVal, oldVal) {
             
           }
         },
        }
        value:监听的属性名
        newVal:属性变化最新值
        oldVal:属性变化改变前值
        deep:是否深度监听,可以监听引用数据类型的每一层,如数组/对象里面的每一项
        immediate:是否立即调用监听
      

vue3中的watch

vue中watch写法如下:

监听ref:


import { ref, watch ,reactive } from 'vue'
监听ref:
let value = ref({
    val:'1212'
  })

watch(value, (newVal, oldVal) => {
    // value:监听的属性名
    // newVal:属性变化最新值
    // oldVal:属性变化改变前值
},{
    immediate:true,
    deep:true
})

vue3中监听多个值写法如下:

监听多个ref 会变成一个数组

import { ref, watch ,reactive} from 'vue'
 
let vlue1 = ref('')
let value2 = ref('')
 
watch([value1,value2], (newVal, oldVal) => {

})

监听Reactive

监听Reactive开启和不开启deep 效果一样

import { ref, watch ,reactive} from 'vue'
 
let value = reactive({
    val:{
        name:''
    }
})
 
 
watch(value, (newVal, oldVal) => {

})

监听reactive 某个值时:

import { ref, watch ,reactive} from 'vue'
 
let value = reactive({
    val1:"",
    val2:""
})
 
watch(()=>value.val2, (newVal, oldVal) => {

})

注意:

  • 定义了reactive的数据在使用watch监听数据改变时,不能正确获取改变之前的值,并且deep属性配置无效,会自动强制开启了深层次监听
  • 使用 ref 初始化一个对象类型或者数组类型的数据时,会自动转成reactive的实现方式,会生成proxy代理对象,也无法正确取改变之前的值
  • 如果接收的变量是一个proxy代理对象,在使用watch监听时,会导致watch回调里无法正确获取改变之前的值

vue3中的高级侦听器(watchEffect)

定义:watchEffect 也是一个帧听器,本质是一个副作用函数。它会监听引用数据类型的所有属性,不需要具体到某个属性,一旦运行就会立即监听,立即执行传入的一个函数,同时响应式追踪其依赖,并在其依赖变更时重新运行该函数,组件卸载的时候会停止监听。

用法:

import { reactive, watchEffect } from 'vue';

  setup(){
    let valueObj = reactive({
      name:'12'
    });
    watchEffect(() => {
      console.log('name:',valueObj.name)
    })

    return {
      obj
    }
  }