From 5d95d602a7210872c66ec73de1db67c74a83b26f Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Sat, 23 Dec 2023 12:14:11 +0800 Subject: [PATCH] Skip useEffect if icon already loaded --- src/components/icon.jsx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/components/icon.jsx b/src/components/icon.jsx index 96d5cebf..c9850506 100644 --- a/src/components/icon.jsx +++ b/src/components/icon.jsx @@ -107,6 +107,8 @@ export const ICONS = { speak: () => import('@iconify-icons/mingcute/radar-line'), }; +const ICONDATA = {}; + function Icon({ icon, size = 'm', @@ -124,11 +126,15 @@ function Icon({ [iconBlock, rotate, flip] = iconBlock; } - const [iconData, setIconData] = useState(null); - useEffect(async () => { - const icon = await iconBlock(); - setIconData(icon.default); - }, [iconBlock]); + const [iconData, setIconData] = useState(ICONDATA[icon]); + useEffect(() => { + if (iconData) return; + (async () => { + const iconB = await iconBlock(); + setIconData(iconB.default); + ICONDATA[icon] = iconB.default; + })(); + }, [iconData, icon, iconBlock]); return (