【问题标题】:Material UI Autocomplete virtualization w/ react-virtuoso带有 react-virtuoso 的 Material UI 自动完成虚拟化
【发布时间】:2021-09-05 05:24:05
【问题描述】:

我有一个几乎可以工作的Material UI Autocomplete 实现,下拉列表用react-virtuoso 虚拟化。

我目前看到的问题是,当向上导航时(the video 中的 0:25),尽管组件似乎认为它向上移动,但列表不会越过最顶部的项目。

列表似乎在内部向上移动,但 gui 并未更新以反映这一点。这在按 ⬆️ 后按 ⬇️ 时很明显:它需要与 ⬆️ 一样多的 ⬇️ 's 在最上面的项目再次突出显示之前。预期的行为是像使用非虚拟化列表一样向上滚动,不确定这是 react-virtuoso 设置的问题,还是自动完成组件的问题,或者此设置结合了两者。

可以在this GitHub issue 或直接在here 中找到有关此问题的视频。

谢谢!

编辑:这是问题的代码框:https://codesandbox.io/s/material-demo-forked-r6i2y?file=/demo.tsx

【问题讨论】:

  • 你能解决这个问题吗?如果您有一个固定的解决方案,您可以发布您的工作解决方案吗?
  • 不,仍然没有有效的解决方案。需要尝试使用 MUIv5 看看它是否更简单
  • 如果你想尝试,我有一个带有 react-virtual 的工作示例
  • 谢谢! react-virtual 不再维护,因此我试图摆脱它
  • 我不这么认为。最后一次更新是在 1 月 21 日。

标签: reactjs material-ui react-virtuoso


【解决方案1】:

我正在使用 Virtuoso 进行 mui 自动完成,只是为了一个简单的用例,我不支持组和东西,但不难添加到代码中。我唯一要做的就是提供一个自定义 ListboxComponent..我唯一要做的就是从父级获取计算的 maxHeight,因为我无法弄清楚如何在调整大小时使高度正常工作

const ListboxComponent = forwardRef<HTMLUListElement>(({ children, ...rest }, ref) => {
  const data = children as ReactElement[];
  const localRef = useRef<string>('200px');

  return (
    <ul
      ref={reference => {
        const maxHeight = reference ? getComputedStyle(reference).maxHeight : null;
        if (maxHeight && maxHeight !== localRef.current) {
          localRef.current = maxHeight;
        }

        if (typeof ref === 'function') {
          ref(reference);
        }
      }}
      {...rest}
    >
      <Virtuoso
        style={{ height: localRef.current }}
        data={data}
        itemContent={(index, child) => {
          return cloneElement(child, { index });
        }}
      />
    </ul>
  );
}) as ComponentType<HTMLAttributes<HTMLElement>>;

【讨论】:

  • 键盘导航在这个例子中有效吗?你有代码沙盒演示吗?
  • @Mbrevda 它适用于react-window,所以我只是尝试用 Virtuoso 来模仿这个例子。见codesandbox.io/s/9ly4u6?file=/demo.tsx
猜你喜欢
  • 1970-01-01
  • 2020-03-12
  • 2021-01-04
  • 1970-01-01
  • 2013-06-02
  • 1970-01-01
  • 2023-03-24
  • 2020-08-07
  • 1970-01-01
相关资源
最近更新 更多