import { ReactInstance } from 'react'; import { findDOMNode } from 'react-dom'; import { isElement } from '@ali/lowcode-utils'; import { isDOMNode } from './is-dom-node'; export const FIBER_KEY = '_reactInternalFiber'; function elementsFromFiber(fiber: any, elements: Array) { if (fiber) { if (fiber.stateNode && isDOMNode(fiber.stateNode)) { elements.push(fiber.stateNode); } else if (fiber.child) { // deep fiberNode.child elementsFromFiber(fiber.child, elements); } if (fiber.sibling) { elementsFromFiber(fiber.sibling, elements); } } } export function reactFindDOMNodes(elem: ReactInstance | null): Array | null { if (!elem) { return null; } if (isElement(elem)) { return [elem]; } const elements: Array = []; const fiberNode = (elem as any)[FIBER_KEY]; elementsFromFiber(fiberNode.child, elements); return elements.length > 0 ? elements : [findDOMNode(elem)]; }