Решено
Использование предложения @HMR в ответ на исходный вопрос:
Если Header и CollectionViewPage являются функциональными компонентами, возможно, вы можете заключить [их] вReact.memo Если они все еще перерисовывают [...], посмотрите на то, что вам нужно, и, возможно, создайте контейнер, который выбирает только то, что вам действительно нужно ...
Реализация:
Добавив средний слой, я могу разделить location
, а затем запомнить SiteLayout
, основываясь на любой его части, которую я хотел бы.
const MyApp = () => {
// unrelated code
return(
<BrowserRouter>
<LocationPartition>
</BrowserRouter>
)
}
export default MyApp
, где в LocationPartition
(возможно, можно было бы использовать более подходящее имя):
const LocationPartition = () => {
const location = useLocation()
const collectionId = location.pathname.split('/')[2]
return(
<SiteLayout collection={collectionId}/>
)
}
export default LocationPartition
и так в SiteLayout
, теперь я могу запоминать, основываясь на collection
пропепередано от LocationPartition
const SiteLayout = memo(({collection})) => {
const [collData, setCollData] = useState()
useEffect(() => {
const getCollectionData = async() => {
//fetch collection data
//setCollData(fetched data)
}
getCollectionData()
}, [collection])
return(
<CollectionContext.Provider value={collData}>
<div className='mainContainer'>
<div className='headerContainer'>
<Header/>
</div>
<div className='mainContent'>
<Route exact path='/collection/:collectionId' component={CollectionViewPage}>
<Route exact path='/collection/:collectionId/item/:itemId' component={ItemViewPage}
</div>
<div className='footerContainer'>
<Footer/>
</div>
</div>
</CollectionContext.Provider>
)
}
export default SiteLayout
И вот и вот ... React Profiler теперь показывает только те рендеры, которые мне нужны!