useMemo
主要用來解決使用React hooks產生的無用渲染的性能問題。使用function的形式來聲明組件,失去了shouldCompnentUpdate
(在組件更新之前)這個生命周期,也就是說我們沒有辦法通過組件更新前條件來決定組件是否更新。而且在函數組件中,也不再區分mount
和update
兩個狀態,這意味着函數組件的每一次調用都會執行內部的所有邏輯,就帶來了非常大的性能損耗。useMemo
和useCallback
都是解決上述性能問題的,這節課先學習useMemo
.
性能問題展示案例
先編寫一下剛才所說的性能問題,建立兩個組件,一個父組件一個子組件,組件上由兩個按鈕,一個是小紅,一個是志玲,點擊哪個,那個就像我們走來了。在/src
文件夾下,新建立一個Example7
的文件夾,在文件夾下建立一個Example7.js
文件.然后先寫第一個父組件。
import React , {useState,useMemo} from 'react'; function Example7(){ const [xiaohong , setXiaohong] = useState('小紅待客狀態') const [zhiling , setZhiling] = useState('志玲待客狀態') return ( <> <button onClick={()=>{setXiaohong(new Date().getTime())}}>小紅</button> <button onClick={()=>{setZhiling(new Date().getTime()+',志玲向我們走來了')}}>志玲</button> <ChildComponent name={xiaohong}>{zhiling}</ChildComponent> </> ) }
父組件調用了子組件,子組件我們輸出兩個姑娘的狀態,顯示在界面上。代碼如下:
function ChildComponent({name,children}){ function changeXiaohong(name){ console.log('她來了,她來了。小紅向我們走來了') return name+',小紅向我們走來了' } const actionXiaohong = changeXiaohong(name) return ( <> <div>{actionXiaohong}</div> <div>{children}</div> </> ) }
然后再導出父組件,讓index.js
可以渲染。
export default Example7
這時候你會發現在瀏覽器中點擊志玲
按鈕,小紅對應的方法都會執行,結果雖然沒變,但是每次都執行,這就是性能的損耗。目前只有子組件,業務邏輯也非常簡單,如果是一個后台查詢,這將產生嚴重的后果。所以這個問題必須解決。當我們點擊志玲
按鈕時,小紅對應的changeXiaohong
方法不能執行,只有在點擊小紅
按鈕時才能執行。
useMemo 優化性能
其實只要使用useMemo
,然后給她傳遞第二個參數,參數匹配成功,才會執行。代碼如下:
function ChildComponent({name,children}){ function changeXiaohong(name){ console.log('她來了,她來了。小紅向我們走來了') return name+',小紅向我們走來了' } const actionXiaohong = useMemo(()=>changeXiaohong(name),[name]) return ( <> <div>{actionXiaohong}</div> <div>{children}</div> </> ) }
這時在瀏覽器中點擊一下志玲
按鈕,changeXiaohong
就不再執行了。也節省了性能的消耗。案例只是讓你更好理解,你還要從程序本身看到優化的作用。好的程序員對自己寫的程序都是會進行不斷優化的,這種沒必要的性能浪費也是絕對不允許的,所以useMemo
的使用在工作中還是比較多的。希望小伙伴們可以掌握。
轉自:https://jspang.com/posts/2019/08/12/react-hooks.html