vue3 watch监听


基础
 
watch(sortType, () => {
    getData();
});
 
深度
watch(
    (): any => route?.query?.tab, // 1 source: WatchSource<any> 监听的数据源
    () => {       // 2 cb: WatchCallback 监听回调
        const tab = route?.query?.tab;
        if (tab) {
            active.value = tab as Tlabel;
            previewActive.value = tab as Tlabel;
        }
    },
    { deep: true, immediate: true } // 3、options?: WatchOptions 配置
);

1.watch

第一次页面展示的时候不会执行,数据变化的时候才会执行,设置了初始化监听(immediate:true)才会被初始化就监听

参数可以拿到当前值和原始值

可以监听多个数据的变化,用一个侦听器承载

2.watchEffect

页面首次加载就会执行

自动检测内部代码,代码中有依赖便会执行

不需要传递要侦听的内容,会自动感知代码依赖,不需要传递很多参数,只要传递一个回调函数

不能获取之前数据的值,只能获取当前值

一些异步的操作放在这里执行会更合适

3.watch函数的两个坑

监听reactive定义的响应式数据(该数据为一个对象,因为reactive只能定义数组或对象类型的响应式)时:oldValue无法正确获取,会强制开启深度监听,deep配置不生效

监听reactive定义的响应式数据中的某个属性时,且该属性是一个对象,此时的deep生效

import {ref,reactive,watch,watchEffect} from 'vue'
export default {
   name:'demo',
   setup(){
       //数据
       let sum = ref(0)
       let msg = ref('hello')
       let person = reactive({
           name:'zhangsan',
           age:'18',
           job:{
               j1:{
                   salary:20
               }
           }
       })
       //监视(三个参数,第一个是监视的对象,第二个是监视的回调函数,第三个是监视的配置)

       //情况一:监视ref所定义的一个响应式数据
       watch(sum,(newValue,oldValue)=>{
           console.log('sum的值变化了',newValue,oldValue)
       },{immediate:true,deep:true})
       //deep深层次触发(此处设置deep无意义)
 
       //情况二:监视ref所定义的多个响应式数据,写成数组的形式
       watch([sum,msg],(newValue,oldValue)=>{
           console.log('sum或者msg变了',newValue,oldValue)
       })
 
       //情况三:监视reactive所定义的响应式数据
       //若监视的是reactive定义的响应式数据,则无法获得oldValue,会强制开启深度监视
 
        //改变person的任意一个属性都会被监视到
        watch(person,(newValue,oldValue)=>{
            console.log('person改变了',newValue,oldValue)
        }) 
        
        //尝试设置deep:false,关闭深度监听(目的:改变job的值不会被watch监听到)
        //发现deep:false并没有生效,原因是此时watch监视的是reactive定义的响应式对象
        //默认强制开启了深度监听
        watch(person,(newValue,oldValue)=>{
            console.log('person改变了',newValue,oldValue)
        },{deep:false}) 
        
 
      //情况四:监视reactive所定义的响应式数据中的某个属性
       watch(()=>person.name,(newValue,oldValue)=>{
            console.log('person的job改变了',newValue,oldValue)
        })
        watch(()=>person.job,(newValue,oldValue)=>{
            console.log('person的job改变了',newValue,oldValue)
        })
        //从上边我们发现改变name会触发监听,但是改变job不会
        //这是因为name属性的值只是一个简单的基本类型数据,
        //而job属性的值是一个对象,比较深,想要监视到,就要开启深度监视,程序如下:
        watch(()=>person.job,(newValue,oldValue)=>{
            console.log('person的job改变了',newValue,oldValue)
        },{deep:true})//此时job改变,会被监视到,此处的deep配置生效
        //需要和情况三进行区分,此处watch监视的是reactive所定义的对象中的某个属性
        //而情况三watch监视的是reactive所定义的对象
 
        //情况五:监视reactive所定义的响应式数据中的某些属性,写成数组的形式
        watch([()=>person.name,()=>person.age],(newValue,oldValue)=>{
            console.log('person的name或age改变了',newValue,oldValue)
        })
 
 
        //watchEffect函数内部所指定的回调中用到的数据只要发生变化,就会重新执行回调
        //只有一个参数,就是回调
        watchEffect(()=>{
            const x1 = sum.value//因为sum是ref定义的响应式数据,需要使用.value调用
            const x2 = person.age
            console.log('watchEffect配置的回调执行了')
        })
 
       //返回一个对象(常用)
       return{
           sum,
           msg,
           person
       }
   }
}

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于Vue 2的`watch`监听不生效的问题,有几个常见的原因和解决方法可以尝试: 1. 确保要监听的属性正确:首先,请确保你正在监听的属性名是正确的,没有拼写错误。另外,如果你要监听的是对象或数组的某个属性,需要使用点语法或者数组索引来指定具体的属性。 2. 深度监听对象或数组:默认情况下,Vue 的`watch`只能监听到对象或数组的变化,而无法监听到其内部属性的变化。如果你需要深度监听对象或数组内部属性的变化,可以给`watch`选项传递一个`{ deep: true }`参数。 ```javascript watch: { obj: { handler(newVal, oldVal) { // 处理变化 }, deep: true } } ``` 3. 使用`immediate`选项:如果你希望在初始渲染时就立即执行一次`watch`回调函数,可以给`watch`选项传递一个`{ immediate: true }`参数。 ```javascript watch: { prop: { handler(newVal, oldVal) { // 处理变化 }, immediate: true } } ``` 4. 使用计算属性替代`watch`:在某些情况下,使用计算属性可能更加适合。计算属性可以响应数据的变化,并返回一个计算后的值。你可以考虑将需要监听的属性定义为计算属性,然后在模板中使用该计算属性。 ```javascript computed: { computedProp() { // 计算属性逻辑 } } ``` 计算属性的优势是它可以自动追踪依赖,只有当依赖的数据变化时,计算属性才会重新计算。 如果以上方法都尝试过了还是无效,你可以提供更具体的代码片段或详细的问题描述,以便我能更好地帮助你解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值