[問題] 關於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