From d588f60208b2ce6bc27dd13f4b01772af30e271b Mon Sep 17 00:00:00 2001 From: Alexey Pyltsyn Date: Mon, 12 Apr 2021 16:03:34 +0300 Subject: [PATCH] perf(v2): avoid rerender of sidebar items while scrolling --- .../src/theme/DocSidebar/index.tsx | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/packages/docusaurus-theme-classic/src/theme/DocSidebar/index.tsx b/packages/docusaurus-theme-classic/src/theme/DocSidebar/index.tsx index 2aa256ae2dbd..6c5c9f7b46a2 100644 --- a/packages/docusaurus-theme-classic/src/theme/DocSidebar/index.tsx +++ b/packages/docusaurus-theme-classic/src/theme/DocSidebar/index.tsx @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import React, {useState, useCallback, useEffect, useRef} from 'react'; +import React, {useState, useCallback, useEffect, useRef, useMemo} from 'react'; import clsx from 'clsx'; import {useThemeConfig, isSamePath} from '@docusaurus/theme-common'; import useUserPreferencesContext from '@theme/hooks/useUserPreferencesContext'; @@ -209,6 +209,27 @@ function DocSidebar({ } }, [windowSize]); + const closeResponsiveSidebar = useCallback( + (e) => { + e.target.blur(); + setShowResponsiveSidebar(false); + }, + [setShowResponsiveSidebar], + ); + const sidebarItems = useMemo( + () => + sidebar.map((item) => ( + + )), + [sidebar, sidebarCollapsible, path, closeResponsiveSidebar], + ); + return (
)} -
    - {sidebar.map((item) => ( - { - e.target.blur(); - setShowResponsiveSidebar(false); - }} - collapsible={sidebarCollapsible} - activePath={path} - /> - ))} -
+
    {sidebarItems}
{hideableSidebar && (