[问题] 关于React.memo

楼主: heavenbetula (绿草)   2021-08-30 20:21:33
各位大大好~
直接列我练习的范例
https://stackblitz.com/edit/react-y311mj
是这样的,这是一个可以计数的按钮,然后范例中有个Expensive的component
会传一个count进去,Expensive会根据这个count变化,
因此按下按钮会render这不意外。
而input字段由于只会修改本身的input值,不会动到count,因此
对于Expensive而言是不需要render的,所以这边试着加入React.memo
来防止Expensive 重新render,这边都没有问题。
但是我想说因为文件上写说React.memo是shallow compare的浅比较
因此上面这个范例,我故意将count用成deep好几层的方式,想试试看
是否就会rerender无效,但意外的是,React.memo却依然正常防止了
Expensive重新render。
请问这是为什么呢?
我传入的prop是{count:{count:0}},这不是shallow了吧
那为什么在input字段输入值的时候,Expensive却不会重新render?
作者: BugofBook (数学书虫)   2021-08-30 20:29:00
因为你使用setCount时,都是回传一个新的物件对不起,我看错问题了...
作者: sevenHEAD (lifegoeson)   2021-08-30 20:53:00
这样没错阿,setValue时没有动到count阿
作者: AJ56   2021-08-30 21:30:00
虽然改了obj上的属性 不过传的都是同一个object地址值都一样看错了 return是不同的objinput改变的时候 ,count没变所以不会重新render没错
作者: at5lp6andy (兔子角傲地滴仿)   2021-08-30 23:14:00
sum宣告在fc定义域内,这会导致每次rerender时,第39行都会重新呼叫,也就是sum会先再次被宣告、定义为0,再去加count
作者: AJ56   2021-08-31 16:29:00
因为传给子的只有count,所以value变动不影响count还是同一个input变的时候,count没变,count是在按add的时候才会变

Links booklink

Contact Us: admin [ a t ] ucptt.com