首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用react-virtualized向下滚动时树项目消失

使用react-virtualized向下滚动时树项目消失
EN

Stack Overflow用户
提问于 2020-10-20 03:48:22
回答 1查看 265关注 0票数 1

最近,我一直在使用react-virtualized库来呈现我的树状项目视图。我遵循了文档中的例子,但是当我向下滚动时,我最终遇到了非常奇怪的问题,项目消失了。

我已经创建了codesandbox来显示这种行为和代码。

https://codesandbox.io/s/bitter-snow-23vci?file=/src/App.js

EN

回答 1

Stack Overflow用户

发布于 2020-10-20 07:01:30

虚拟化列表的主要思想是将其呈现为列表。

如果您向下传递树状结构并像在代码示例中那样呈现它

代码语言:javascript
复制
<List
 ....
            rowCount={data.length}
          />

您不需要更改Node值并在您的rowCount组件中保持展开状态。

代码语言:javascript
复制
const Node = ({ data, listRef, depth }) => {
  const [isExpanded, setIsExpanded] = React.useState(false);

但当您滚动出屏幕时,Node元素将被销毁并重新创建,然后返回。

您需要将您的选择保留在Node元素之外。

喜欢

代码语言:javascript
复制
// [key]: value structure there key is id of element and value [true, false].
const rootObject = {[elementId]: true};
const App = () => {
  const [visibleNodes, setVisibleNodes] = useState(rootObject)

  ....
  <List
           ...
            rowRenderer={({ index, style, key }) => {
              return (
                <Node
                  setVisibleNodes={setVisibleNodes}
                  visibleNodes={visibleNodes}
                  style={style}
                  key={key}
                  data={data[index]}
                  listRef={ref}
                  depth={1}
                />
              );
            }}
            rowCount={data.length}
            width={width}
          />

和在节点中

代码语言:javascript
复制
const Node = ({ data, listRef, depth, setVisibleNodes, visibleNodes }) => {
  const isExpanded = visibleNodes[data.id];
  const handleClick = (e) => {
    if (data.children.length === 0) return;

    e.stopPropagation();
    setVisibleNodes({...visibleNodes, [data.id]: !!isExpanded});
    listRef.current.recomputeRowHeights();
    listRef.current.forceUpdate();
  };

  return (
    <div onClick={handleClick}>
      {data.children.length ? (isExpanded ? "[-]" : "[+]") : ""} {data.name}
      {isExpanded && (
        <div style={{ marginLeft: depth * 15 }}>
          {data.children.map((child, index) => (
            <Node
              key={index}
              data={child}
              listRef={listRef}
              depth={depth + 1}
            />
          ))}
        </div>
      )}
    </div>
  );
};

我认为它起作用了)

但更好的做法是像真正的列表一样,让树形结构看起来很直观。通过这种方式,您将使用创建者所使用的虚拟化列表)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64434246

复制
相关文章

相似问题

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