各位大大好~
直接列我练习的范例
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?
因为你使用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的时候才会变