watchEffect 的疑问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
freezebreze
0.06D
V2EX    前端开发

watchEffect 的疑问

  •  
  •   freezebreze 2024-01-10 11:17:35 +08:00 1124 次点击
    这是一个创建于 716 天前的主题,其中的信息可能已经有所发展或是发生改变。
    watchEffect(()=>{ if(temp.value >= 60 || height.value >= 80){ console.log('联系服务器') } }) let temp = ref(10) let height = ref(0) 

    当 temp.value = 60 去改变 height 没有运行回调,是因为什么? 我猜测是 true || expr 短路了 后面的没求值的问题 有没有大佬说下更具体的~

    3 条回复    2024-01-14 15:20:09 +08:00
    Charrlles
        1
    Charrlles  
       2024-01-11 10:54:37 +08:00 via iPhone   1
    每次触发 watchEffect 的时候都会重新收集依赖,然后会和上一次跟踪的依赖比较,如果一个依赖之前跟踪过,但这次没有,就会被清掉。你这个例子就是因为短路,依赖被清除了。用 watch 就可以了
    Man957
        2
    Man957  
       2024-01-13 16:44:29 +08:00
    @Charrlles 能详细讲解下,比如:第一次收集了那些依赖,第二次收集的那些依赖?
    Charrlles
        3
    Charrlles  
       2024-01-14 15:20:09 +08:00 via iPhone
    @Man957 简单来说,temp 和 height 是两个 proxy 对象,首次渲染的时候,会执行一次 watchEffect 的回调,在他们的 get 方法里会调用 track ,将当前的 effect ,也就是 watchEffect ,记录到相应的 dep 里( dep 就是一个记录 effect 的 Map 对象,也就是所谓的依赖),同时,也会把这些 dep 推到 effect.deps 数组里。当 temp.value 变化的时候,触发 set 方法,触发之前记录在 dep 里的 effect ,最终触发 effect.run(),也就是 watchEffect 里的回调,执行回调的时候,就会再次触发 get 方法,effect.deps 也会更新,更新时会比较新的 dep 和旧的 dep 。假设这次 temp.value 已经足够大了,由于 if 里的短路,不会触发 height 的 get 方法,比较 dep 的时候就会给 height 的旧 dep 执行 cleanup 方法,所以之后也就不会触发了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2605 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 14:49 PVG 22:49 LAX 06:49 JFK 09:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86