首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止条件中的映射组件重新加载?

防止条件中的映射组件重新加载?
EN

Stack Overflow用户
提问于 2022-04-08 20:38:20
回答 2查看 36关注 0票数 0

我有一个有两个选项卡/按钮“最近”和“顶部”的屏幕。在两者之间切换时,单个项目总是重新加载数据,这是不必要的,并导致移动。我还没能用useMemo或其他类似的方法解决这个问题。

如何使组件在选项卡之间切换时不再加载其数据:

沙箱中可编辑的示例:码箱

编辑:我意识到我可以使用CSS隐藏非活动选项卡,或者我可以在更高级别加载数据以防止重新加载-但是在组件级别,可以停止数据的重新加载吗?

代码语言:javascript
复制
import * as React from "react";
import "./styles.css";

const delay = (ms) => new Promise((res) => setTimeout(res, ms));

const Item = ({ title }) => {
  const [itemLoading, setItemLoading] = React.useState(true);

  async function loadItem() {
    await delay((Math.random() * (3 - 1) + 1) * 1000);
    setItemLoading(false);
  }

  React.useEffect(() => {
    loadItem();
  }, []);

  if (itemLoading) {
    return (
      <div className="w-full text-center py-4 border bg-white rounded shadow-lg">
        item is loading ...
      </div>
    );
  } else {
    return (
      <div className="w-full text-center py-4 border bg-white rounded shadow-lg">
        item {title}
      </div>
    );
  }
};

export default function App() {
  const [tab, setTab] = React.useState("Recent");
  const recentItems = ["1", "2", "3", "4", "5", "6", "7", "9"];
  const topItems = ["99", "98", "97", "96", "95", "94", "93"];

  return (
    <div className="w-screen h-screen bg-gray-100">
      <h1 className="text-2xl text-center py-4">Current Tab: {tab}</h1>
      <section className="w-full h-24 grid grid-cols-2">
        <div
          className="cursor-pointer text-center bg-red-200 pt-8"
          onClick={() => {
            setTab("Recent");
          }}
        >
          Recent
        </div>
        <div
          className="cursor-pointer text-center bg-yellow-200 pt-8"
          onClick={() => {
            setTab("Top");
          }}
        >
          Top
        </div>
      </section>

      <section>
        {tab === "Recent"
          ? recentItems.map((item) => <Item key={item} title={item} />)
          : topItems.map((item) => <Item key={item} title={item} />)}
      </section>
    </div>
  );
}
EN

回答 2

Stack Overflow用户

发布于 2022-04-08 21:22:28

每次tab状态发生变化时,都会调用array.map并创建一个新的react组件数组:

代码语言:javascript
复制
{tab === "Recent"
          ? recentItems.map((item) => <Item key={item} title={item} />)
          : topItems.map((item) => <Item key={item} title={item} />)}

每次创建新组件时,您提供的代码都会尝试使用异步调用和ReactDOM重新呈现表来获取数据。如果速度是一个约束,数据获取部分应该从组件中分离出来。

您可以通过将数据状态移动到上面的组件(在您的例子中是App)或将其单独处理到其他地方来实现这一点。建议采用第一种选择。

票数 1
EN

Stack Overflow用户

发布于 2022-04-09 13:46:51

我解决这一问题而不进一步移动数据加载的方法是将选项卡的高度和宽度设置为0,并将其标记为隐藏(除非它是当前选项卡)。这消除了所有双重加载和累积布局移位,而不修改大量的代码。

(顺风)

代码语言:javascript
复制
const hiddenClass = "w-0 h-0 hidden"

<div className={currentTab === "Recent" ? undefined : hiddenClass} >
...recent items
</div>
<div className={currentTab === "Popular" ? undefined : hiddenClass} >
...popular items
</div>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71802906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档