Vue3 修改 ref的值,不触发watchEffect的原因

3 篇文章 0 订阅

const myRef = ref(name: ‘jinD’)

修改 myRef.value.xxx时,不触发watchEffect的原因在于,触发trigger传入的对象是否相同,在 watchEffect 里面访问 myRef.value 时,此时 track的target 是refCompImpl实例,也就是ref

但是修改值时,是通过 myRef.value.xxx = newValue, 不是给 myRef.value = {}设置新值,触发的trigger是在 proxy 的 getter里面(ref 都给传入的对象调用了reative, 也就是把传入的对象转为了proxy),此时trigger的target = {name: ‘xxx’}, 和之前track的 target不一致,没有获取到对应的effect(一个effect就是一个依赖,这里可以理解为watchEffect传入的cb), 所以不会导致 watchEffect 传入的cb重新执行

代码解析:

import { defineComponent, computed, ref, watchEffect } from 'vue'

const obj = {
  name: 'jinD',
}
export default defineComponent({
  name: 'app',

  setup() {
    const myRef = ref({ name: 'jinD' })

    watchEffect(() => {
      console.log('watchEffect 执行')

      console.log(myRef.value) // 这里收集的依赖时 target = refCompImpL
    })

    // debugger
    // myRef.value = { name: 'ding123' }  这样才会导致 watchEffect 重新执行

    myRef.value.name = 'ding1' // 修改的是 name的值,没有修改ref.value的值,不会触发ref的trigger,触发的trigger是在 myRef.value这个proxy上面的,修改 myRef.value.name 时,触发的trigger是在 proxy的setter里面的,此时触发trigger ,target = {name: 'jinD'}, 但是没有给{name: 'jinD'} 收集依赖,所以不会触发 watchEffect 的 cb

    return () => {
      
      return <p>123</p>
    }
  },
})

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值