使用 React-dnd 的 MUI 树视图

MUI tree view with React-dnd

我有一个 material ui v4 树视图,可以使用下面的代码与 react-dnd 一起正常工作。

当我升级到 mui v5 树视图时,拖动不再起作用,项目不再可拖动。

我查看了 2 个 TreeItem 实现,但有很多变化,我迷路了。

https://github.com/mui-org/material-ui/blob/v4.x/packages/material-ui-lab/src/TreeItem/TreeItem.js

https://github.com/mui-org/material-ui/blob/master/packages/mui-lab/src/TreeItem/TreeItem.js

我错过了什么?非常感谢您的回答:)

//recursive function to generate TreeItem tree with Drag embedded
function Box({ treeItem }) {
  const [{ isDragging }, drag, preview] = useDrag(() => ({
    type: "TREEVIEW",
    item: !treeItem.children.length //if the resource has no child
      ? treeItem.data // we provide only the resource data
      : [
          treeItem.data,
          ...flatten(extractChildren(treeItem), extractChildren).map(
            //other wise we provide resource + child resources
            (x) => delete x.children && x
          ),
        ],
    collect: (monitor) => ({
      isDragging: monitor.isDragging(),
    }),
  }));

  return (
    <>
      <DragPreviewImage connect={preview} src={knightImage} />
      <TreeItem
        nodeId={treeItem.data.TreeID}
        label={treeItem.data.TreeName}
        ref={drag}
        style={{ isDragging }}
      >
        {treeItem.children &&
          treeItem.children.map((treeItem) => <Box treeItem={treeItem} />)}
      </TreeItem>
    </>
  );
}

const renderedListItems = tree.map((treeItem) => (
  <Box treeItem={treeItem} />
));

发生这种情况的原因可能是在单击树项时选中了树项。尽管 disableSelectionTreeView 中设置为 true,但点击的子级仍以某种方式通过 aria-activedescendant 属性 在根级别聚焦。

我们可以通过在 TreeItem 处添加 onFocusCapture={e => e.stopPropagation()} 来跳过此焦点事件,这有效地使项目可拖动。