react-window 与下一个 13 布局

react-window with next 13 layout

提问人:Caffeine 提问时间:6/23/2023 更新时间:6/27/2023 访问量:57

问:

我有一个带有新闻页面的应用程序,我想为它实现无限滚动。 我正在使用 next 13,并且我通过根布局设置了应用程序范围的导航和页脚。 我正在尝试使用 react-window 来有效地设置它,我希望让 react-window 滚动条的行为像默认滚动条一样,卡在右上角并跨越整个高度。

我的应用程序宽度限制为 1920px,之后是白条,页脚和页眉占用了一些高度空间。

我试过修补绝对位置和假容器 div,但我无法同时放置正确的滚动条和页脚。

我找不到任何例子来展示我想要实现的目标。要么 react-window 部分是全屏的,没有其他内容,要么页面上的其他内容没有在滚动条中考虑(它不是页面的全高)

这是我最近的一次尝试,但没有运气

function Wrapper({ hasNextPage, isNextPageLoading, items, loadNextPage }) {
  const itemCount = hasNextPage ? items.length + 1 : items.length;

  const loadMoreItems = isNextPageLoading ? () => {} : loadNextPage;

  const isItemLoaded = (index) => !hasNextPage || index < items.length;

  const Item = ({ index }) => {
    let content;
    if (!isItemLoaded(index)) {
      content = "Loading...";
    } else {
      content = items[index].name.first;
    }

    return <div className={styles.item}>{content}</div>;
  };
  const [size, setSize] = React.useState([0, 0]);

  React.useEffect(() => {
    setSize([window.innerWidth, window.innerHeight]);
  }, []);

  return (
    <div className={styles.container}>
      <InfiniteLoader
        isItemLoaded={isItemLoaded}
        itemCount={itemCount}
        loadMoreItems={loadMoreItems}
      >
        {({ onItemsRendered, ref }) => (
          <FixedSizeList
            itemCount={itemCount}
            onItemsRendered={onItemsRendered}
            ref={ref}
            height={size[1]}
            width={size[0]}
            itemSize={35}
          >
            {Item}
          </FixedSizeList>
        )}
      </InfiniteLoader>
    </div>
  );
}

css:

.container {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
}

.item {
  max-width: 1920px;
  margin: 0 auto;
}
javascript css reactjs 反应窗口

评论


答:

0赞 Caffeine 6/27/2023 #1

我还没有决定是要从布局中完全删除全局导航和页脚,还是只是专门将其隐藏在新闻页面中,但这里有一个解决方案。 将页眉追加到第一个列表项,并将页脚追加到最后一个列表项。

  // Render an item or a loading indicator.
  const Item = ({ index }) => {
    if (!isItemLoaded(index)) {
      return "Loading...";
    }

    if (index === 0)
      return (
        <React.Fragment>
          <Nav />
          <Article item={items[index]} />
        </React.Fragment>
      );

    if (index === items.length - 1)
      return (
        <React.Fragment>
          <Article item={items[index]} />
          <Footer />
        </React.Fragment>
      );

    return <Article item={items[index]} />;
  };