React利用React.memo和useCallback緩存彈窗組件
父組件TenantManage在每次執(zhí)行useState時(shí)會(huì)重新渲染,導(dǎo)致子組件UserForm也會(huì)觸發(fā)重新渲染,即使父組件做的操作和UserForm一點(diǎn)關(guān)系也沒(méi)有,也會(huì)觸發(fā)
解決方式:利用React.memo緩存子組件,在父組件使用緩存版本的MyUserForm
import UserForm from './userForm' //彈窗組件 function TenantManage() { return ( <div className='userList'> {/* 彈窗組件 */} <MyUserForm visiable={isOpenModal} closeModel={closeModel} modelTitle={modelTitle} getUserListWrap={getUserListWrap}></MyUserForm> <Card className='searchFlex'> </Card> </div> ) } const MyUserForm = React.memo(UserForm) //緩存版本的模態(tài)框組件 export default TenantManage
但是上述還是有問(wèn)題,父組件useState子組件還是會(huì)重新渲染
因?yàn)楦附M件給子組件傳遞了closeModel這個(gè)方法,和visiable、modelTitle這些屬性,雖然React.memo能將屬性緩存,但是沒(méi)辦法把函數(shù)緩存。
深入解釋:
1、React.memo會(huì)對(duì)組件的props進(jìn)行淺比較(即比較前后props的每個(gè)屬性值是否相等,對(duì)于基本類型比較值,對(duì)于引用類型比較引用地址)。
2. 對(duì)于屬性中的函數(shù),由于每次父組件渲染都會(huì)創(chuàng)建一個(gè)新的函數(shù)實(shí)例(引用改變),所以即使函數(shù)內(nèi)容相同,React.memo也會(huì)認(rèn)為該prop發(fā)生了變化,從而導(dǎo)致子組件重新渲染。
最終解決方法:使用useCallback緩存函數(shù)
// 原來(lái)的方法 // function closeModel() { // setIsOpenModal(false) // } //使用useCallback緩存 const closeModel = useCallback(() => { setIsOpenModal(false) }, [])
到此這篇關(guān)于React利用React.memo和useCallback緩存彈窗組件的文章就介紹到這了,更多相關(guān)React緩存彈窗內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- React實(shí)現(xiàn)頁(yè)面狀態(tài)緩存(keep-alive)的示例代碼
- react:swr接口緩存案例代碼
- React中使用Workbox進(jìn)行預(yù)緩存的實(shí)現(xiàn)代碼
- Reactor?WebFlux集成Redis處理緩存操作
- react實(shí)現(xiàn)組件狀態(tài)緩存的示例代碼
- React中實(shí)現(xiàn)keepalive組件緩存效果的方法詳解
- React router cache route實(shí)現(xiàn)緩存頁(yè)面流程介紹
- react+django清除瀏覽器緩存的幾種方法小結(jié)
- 探究react-native 源碼的圖片緩存問(wèn)題
相關(guān)文章
React使用Echarts/Ant-design-charts的案例代碼
這篇文章主要介紹了React使用Echarts/Ant-design-charts的實(shí)例代碼,本文通過(guò)實(shí)例代碼給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-11-11React獲取組件對(duì)應(yīng)的DOM元素多種實(shí)現(xiàn)方法
本文主要介紹了React中獲取組件對(duì)應(yīng)DOM元素的多種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02React實(shí)現(xiàn)路由鑒權(quán)的實(shí)例詳解
React應(yīng)用中的路由鑒權(quán)是確保用戶僅能訪問(wèn)其授權(quán)頁(yè)面的方式,用于已登錄或具有訪問(wèn)特定頁(yè)面所需的權(quán)限,這篇文章就來(lái)記錄下React實(shí)現(xiàn)路由鑒權(quán)的流程,需要的朋友可以參考下2024-07-07React?SSR架構(gòu)Stream?Rendering與Suspense?for?Data?Fetching
這篇文章主要為大家介紹了React?SSR架構(gòu)Stream?Rendering與Suspense?for?Data?Fetching解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03詳解基于React.js和Node.js的SSR實(shí)現(xiàn)方案
這篇文章主要介紹了詳解基于React.js和Node.js的SSR實(shí)現(xiàn)方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03