useMemo
主要用來解決使用React hooks產生的無用渲染的性能問題。使用function的形式來聲明組件,失去了shouldCompnentUpdate
(在組件更新以前)這個生命週期,也就是說咱們沒有辦法經過組件更新前條件來決定組件是否更新。並且在函數組件中,也再也不區分mount
和update
兩個狀態,這意味着函數組件的每一次調用都會執行內部的全部邏輯,就帶來了很是大的性能損耗。useMemo
和useCallback
都是解決上述性能問題的,這節課先學習useMemo
.javascript
先編寫一下剛纔所說的性能問題,創建兩個組件,一個父組件一個子組件,組件上由兩個按鈕,一個是小紅,一個是志玲,點擊哪一個,那個就像咱們走來了。在/src
文件夾下,新創建一個Example7
的文件夾,在文件夾下創建一個Example7.js
文件.而後先寫第一個父組件。html
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> </> ) }
父組件調用了子組件,子組件咱們輸出兩個姑娘的狀態,顯示在界面上。代碼以下:java
function ChildComponent({name,children}){ function changeXiaohong(name){ console.log('她來了,她來了。小紅向咱們走來了') return name+',小紅向咱們走來了' } const actionXiaohong = changeXiaohong(name) return ( <> <div>{actionXiaohong}</div> <div>{children}</div> </> ) }
而後再導出父組件,讓index.js
能夠渲染。react
export default Example7
這時候你會發如今瀏覽器中點擊志玲
按鈕,小紅對應的方法都會執行,結果雖然沒變,可是每次都執行,這就是性能的損耗。目前只有子組件,業務邏輯也很是簡單,若是是一個後臺查詢,這將產生嚴重的後果。因此這個問題必須解決。當咱們點擊志玲
按鈕時,小紅對應的changeXiaohong
方法不能執行,只有在點擊小紅
按鈕時才能執行。程序員
其實只要使用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.htmljsp