【发布时间】:2021-12-09 15:32:31
【问题描述】:
我有一个<Accordion/> 组件,它可以容纳多个<AccordionItem/> 组件。我准备了codesandbox demo here。
目前的问题是在初始渲染时,所有<AccordionItem/> 组件都被渲染(检查代码框示例中的控制台日志)。因此,根据 <Accordion/> 组件用于渲染所有项目的数组大小,这意味着很多初始渲染。此外,每次打开 <AccordionItem/> 时,<Accordion/> 内的所有项目都会重新渲染。出于性能考虑,这可能不是几个项目的问题。但是,在我的应用程序中,这可能是 10 个<AccordionItem/> 组件它们自己有一个嵌套的手风琴,每次用户打开它们时都会不断地重新渲染。所以这可能意味着每次用户打开一个项目时,都会发生大约 50 次重新渲染。
我已经尝试了很多方法来消除这种情况。例如,手风琴依赖于 active 布尔值。因此,只有当 active 布尔值为 true 时才渲染手风琴的主体才能消除问题,如下所示:
<div className="answer">{active && <AccordionBody />}</div>
但是,下拉动画停止工作并且body没有完全打开。我该怎么做才能只渲染点击的<AccordionItem/> 及其主体,同时保持漂亮的下拉动画?
【问题讨论】:
-
“所以这可能意味着每次用户打开一个项目,大约会发生 50 次重新渲染。”为什么会出现问题?
-
我在您的代码和框中没有看到任何控制台日志。那里的代码似乎可以毫无问题地运行。您可以编辑沙盒以重现您的问题吗?
-
嗨@DrewReese。我更新了代码框 (codesandbox.io/s/aged-shape-bc32x)。对不起,今天早上我很着急。如果每次打开一个项目时都渲染所有组件,也许这甚至不是问题。它似乎有点递归。
-
@DennisVash 好吧,我不知道是不是有问题。也许它极大地减慢了我的应用程序,也许不是。无论如何,这似乎是不必要的,并且是可以预防的。我只是不知道现在如何。我对 React 的经验还不是很丰富,所以如果你说我不应该太担心它,那也没关系。
标签: javascript html reactjs performance jsx