我正在我的项目中使用react-flow-renderer。我们有一个要求,我们想通过点击它来删除元素。
我已经尝试了下面的代码。
const onElementsRemove = (elementsToRemove) => setElements((els) => removeElements(elementsToRemove, els));
我也把这
但我们不希望这样。有没有人能知道如何做到这一点,这将是一个很大的帮助
lnlaulya1#
实际上,我自己使用带有自定义删除按钮的ReactFlow控件解决了这个问题。在<ReactFlow>组件中,我添加了onElementClick prop,它使用React钩子来存储状态中的选定元素。在按钮的onClick prop中,我有另一个钩子,它从状态中获取选定元素,树的所有边,然后调用getConnectedEdges(),它将返回与所选元素相连的所有边。然后将一个包含所选元素和相连边的数组传递给onElementsRemove()。以下是onElementClick的文档。https://reactflow.dev/docs/api/component-props/
<ReactFlow>
onElementClick
onClick
getConnectedEdges()
onElementsRemove()
<ReactFlow className={flowStyles} elements={elements} onElementClick={onClickElement} > <Controls showInteractive={false}> <ControlButton onClick={onClickElementDelete}> <DeleteIcon /> </ControlButton> </Controls> </ReactFlow>
const onClickElement = useCallback((event: ReactMouseEvent, element: Node | Edge) => { // Set the clicked element in local state setState({ clickedElement: [element] }) }, [])
以下是getConnectedEdges的文档。https://reactflow.dev/docs/api/helper-functions/
getConnectedEdges
const onClickElementDelete = useCallback(() => { // Get all edges for the flow const edges = elements.filter((element: Node | Edge) => isEdge(element)) // Get edges connected to selected node const edgesToRemove = getConnectedEdges(state.clickedElement, edges) onElementsRemove([...state.clickedElement, ...edgesToRemove]) } }, [elements, onElementsRemove, state.clickedElement])
sg2wtvxw2#
您必须在自定义节点的数据属性中添加删除函数,并且在单击自定义节点的删除按钮时,您必须调用该函数创建自定义节点时=〉
const newNode = { id: nodeID, type, position, data: { onDelete : yourFunctionToDelete }}
删除按钮中的自定义节点代码=〉onClick={props.data.onDelete}
az31mfrm3#
您可以在组件外部使用单独的状态管理库,并直接从节点内部触发操作。官方文档Using a State Management Library中提到了该技术。上面写着:正如您在前面的指南和示例中所看到的,ReactFlow可以很容易地与本地状态一起使用,以处理图的节点和边缘。当您的应用程序不断增长,并且您希望从节点内部更改状态时,事情很容易变得更加复杂。为了避免通过节点数据字段向下传递函数,您可以使用React上下文或添加状态管理库,如本指南中所述。例如,如果您创建了一个如文档所示的Zustand存储,并从中公开了一个deleteNode操作,那么,您可以使用const deleteNode = useStore((s) => s.deleteNode);从自定义节点访问它。
deleteNode
const deleteNode = useStore((s) => s.deleteNode);
qxgroojn4#
我可以使用下面的函数实现以下功能。
const deleteNodeById = (id) => { flowInstance.setNodes((nds) => nds.filter((node) => node.id !== id)) }
并将此函数传递给我的删除按钮(在我的情况下是mui删除图标)
<DeleteOutlined onClick={() => deleteNodeById(data.id)} />
4条答案
按热度按时间lnlaulya1#
实际上,我自己使用带有自定义删除按钮的ReactFlow控件解决了这个问题。在
<ReactFlow>
组件中,我添加了onElementClick
prop,它使用React钩子来存储状态中的选定元素。在按钮的onClick
prop中,我有另一个钩子,它从状态中获取选定元素,树的所有边,然后调用getConnectedEdges()
,它将返回与所选元素相连的所有边。然后将一个包含所选元素和相连边的数组传递给onElementsRemove()
。以下是
onElementClick
的文档。https://reactflow.dev/docs/api/component-props/以下是
getConnectedEdges
的文档。https://reactflow.dev/docs/api/helper-functions/sg2wtvxw2#
您必须在自定义节点的数据属性中添加删除函数,并且在单击自定义节点的删除按钮时,您必须调用该函数
创建自定义节点时=〉
删除按钮中的自定义节点代码=〉onClick={props.data.onDelete}
az31mfrm3#
您可以在组件外部使用单独的状态管理库,并直接从节点内部触发操作。
官方文档Using a State Management Library中提到了该技术。
上面写着:
正如您在前面的指南和示例中所看到的,ReactFlow可以很容易地与本地状态一起使用,以处理图的节点和边缘。当您的应用程序不断增长,并且您希望从节点内部更改状态时,事情很容易变得更加复杂。为了避免通过节点数据字段向下传递函数,您可以使用React上下文或添加状态管理库,如本指南中所述。
例如,如果您创建了一个如文档所示的Zustand存储,并从中公开了一个
deleteNode
操作,那么,您可以使用const deleteNode = useStore((s) => s.deleteNode);
从自定义节点访问它。qxgroojn4#
我可以使用下面的函数实现以下功能。
并将此函数传递给我的删除按钮(在我的情况下是mui删除图标)